Python Language
Zugriff auf Python-Quellcode und Bytecode
Suche…
Zeigt den Bytecode einer Funktion an
Der Python-Interpreter kompiliert Code zu Bytecode, bevor er auf der virtuellen Maschine von Python ausgeführt wird (siehe auch Was ist Python-Bytecode?) .
So zeigen Sie den Bytecode einer Python-Funktion an
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)
Die Funktion dis.dis
im dis-Modul gibt einen dekompilierten Bytecode der an sie übergebenen Funktion zurück.
Das Code-Objekt einer Funktion untersuchen
CPython ermöglicht den Zugriff auf das Codeobjekt für ein Funktionsobjekt.
Das __code__
Objekt enthält den rohen Bytecode ( co_code
) der Funktion sowie andere Informationen wie Konstanten und Variablennamen.
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__)
Zeigen Sie den Quellcode eines Objekts an
Objekte, die nicht eingebaut sind
Um den Quellcode eines Python-Objekts zu drucken, verwenden Sie inspect
. Beachten Sie, dass dies nicht für integrierte Objekte oder für interaktiv definierte Objekte funktioniert. Für diese benötigen Sie andere Methoden, die später erläutert werden.
So drucken Sie den Quellcode der Methode randint
aus dem 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)
So drucken Sie einfach die Dokumentationszeichenfolge
print(inspect.getdoc(random.randint))
# Output:
# Return random integer in range [a, b], including both end points.
Vollständigen Pfad der Datei random.randint
in der die Methode random.randint
definiert ist:
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
Objekte interaktiv definiert
Wenn ein Objekt interaktiv definiert ist inspect
kann dill.source.getsource
den Quellcode nicht bereitstellen, stattdessen können Sie dill.source.getsource
verwenden
# 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
Eingebaute Objekte
Der Quellcode für die in Python integrierten Funktionen ist in c geschrieben und kann nur über den Quellcode von Python (gehostet bei Mercurial oder unter https://www.python.org/downloads/source/) aufgerufen werden.
print(inspect.getsource(sorted)) # raises a TypeError
type(sorted) # <class 'builtin_function_or_method'>