Python Language
Accéder au code source Python et au bytecode
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'>