Recherche…


Affiche le bytecode d'une fonction

L'interpréteur Python compile le code en bytecode avant de l'exécuter sur la machine virtuelle Python (voir aussi What is python bytecode?.

Voici comment afficher le bytecode d'une fonction Python

import dis

def fib(n):
    if n <= 2: return 1
    return fib(n-1) + fib(n-2)

# Display the disassembled bytecode of the function.
dis.dis(fib)

La fonction dis.dis du module dis retournera un bytecode décompilé de la fonction qui lui est transmise.

Explorer l'objet code d'une fonction

CPython permet d'accéder à l'objet code pour un objet fonction.

L'objet __code__ contient le bytecode brut ( co_code ) de la fonction ainsi que d'autres informations telles que les constantes et les noms de variables.

def fib(n):
    if n <= 2: return 1
    return fib(n-1) + fib(n-2)
dir(fib.__code__)

def fib(n):
    if n <= 2: return 1
    return fib(n-1) + fib(n-2)
dir(fib.__code__)

Affiche le code source d'un objet

Objets qui ne sont pas intégrés

Pour imprimer le code source d'un objet Python, utilisez inspect . Notez que cela ne fonctionnera pas pour les objets intégrés ni pour les objets définis de manière interactive. Pour cela, vous aurez besoin d'autres méthodes expliquées plus tard.

Voici comment imprimer le code source de la méthode randint partir du module random :

import random
import inspect

print(inspect.getsource(random.randint)) 
# Output:
#    def randint(self, a, b):
#        """Return random integer in range [a, b], including both end points.
#        """
#
#        return self.randrange(a, b+1)

Pour imprimer la chaîne de documentation

print(inspect.getdoc(random.randint))
# Output:
# Return random integer in range [a, b], including both end points.

Imprimer le chemin complet du fichier où la méthode random.randint est définie:

print(inspect.getfile(random.randint))
# c:\Python35\lib\random.py
print(random.randint.__code__.co_filename) # equivalent to the above
# c:\Python35\lib\random.py

Objets définis interactivement

Si un objet est défini de manière interactive, l' inspect ne peut pas fournir le code source, mais vous pouvez utiliser dill.source.getsource place.

# define a new function in the interactive shell
def add(a, b):
   return a + b
print(add.__code__.co_filename) # Output: <stdin> 

import dill
print dill.source.getsource(add)
# def add(a, b):
      return a + b

Objets intégrés

Le code source des fonctions intégrées de Python est écrit en c et accessible uniquement en consultant le code source de Python (hébergé sur Mercurial ou téléchargeable sur https://www.python.org/downloads/source/) .

print(inspect.getsource(sorted)) # raises a TypeError
type(sorted) # <class 'builtin_function_or_method'>


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow