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'>


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow