Python Language
Åtkomst till Python-källkod och kod
Sök…
Visa bytekoden för en funktion
Python-tolkaren sammanställer kod till bytekod innan den körs på Pythons virtuella maskin (se även Vad är python-bytekod?) .
Så här visar du bytekoden för en Python-funktion
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)
Funktionen dis.dis
i dis-modulen kommer att återvända en dekompilerade bytekod av funktionen skickas till den.
Utforska kodobjektet för en funktion
CPython tillåter åtkomst till kodobjektet för ett funktionsobjekt.
Objektet __code__
innehåller den råa bytekoden ( co_code
) för funktionen samt annan information som konstanter och variabla namn.
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__)
Visa källkoden för ett objekt
Objekt som inte är inbyggda
För att skriva ut källkoden för ett Python-objekt använder du inspect
. Observera att detta inte fungerar för inbyggda objekt eller för objekt som definieras interaktivt. För dessa behöver du andra metoder som förklaras senare.
Så här skriver ut källkoden för metoden randint
från random
modulen:
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)
För att bara skriva ut dokumentationssträngen
print(inspect.getdoc(random.randint))
# Output:
# Return random integer in range [a, b], including both end points.
Skriv ut hela sökvägen för filen där metoden random.randint
definieras:
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
Objekt definieras interaktivt
Om ett objekt definieras interaktivt kan inspect
inte ange källkoden utan du kan använda dill.source.getsource
istället
# 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
Inbyggda föremål
Källkoden för Pythons inbyggda funktioner är skriven i c och kan endast nås genom att titta på Pythons källkod (värd på Mercurial eller nedladdningsbar från https://www.python.org/downloads/source/) .
print(inspect.getsource(sorted)) # raises a TypeError
type(sorted) # <class 'builtin_function_or_method'>