Python Language
Toegang tot Python-broncode en bytecode
Zoeken…
Geef de bytecode van een functie weer
De Python-interpreter compileert code naar bytecode voordat deze wordt uitgevoerd op de virtuele machine van Python (zie ook Wat is python bytecode?) .
U kunt als volgt de bytecode van een Python-functie bekijken
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)
De functie dis.dis
in de dis-module retourneert een gedecompileerde bytecode van de functie die eraan is doorgegeven.
Het code-object van een functie verkennen
CPython geeft toegang tot het code-object voor een functieobject.
Het __code__
object bevat de onbewerkte bytecode ( co_code
) van de functie, evenals andere informatie zoals constanten en variabelenamen.
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__)
Geef de broncode van een object weer
Objecten die niet ingebouwd zijn
De broncode van Python objectspecifieke drukken inspect
. Merk op dat dit niet werkt voor ingebouwde objecten noch voor objecten die interactief zijn gedefinieerd. Hiervoor hebt u andere methoden nodig die later worden uitgelegd.
U kunt als volgt de broncode van de methode randint
vanuit de random
module afdrukken:
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)
Om alleen de documentatiestring af te drukken
print(inspect.getdoc(random.randint))
# Output:
# Return random integer in range [a, b], including both end points.
Druk het volledige pad van het bestand af waar de methode random.randint
is gedefinieerd:
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
Objecten interactief gedefinieerd
Als een object interactief is gedefinieerd, kan inspect
niet de broncode leveren, maar kunt u in plaats daarvan dill.source.getsource
gebruiken
# 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
Ingebouwde objecten
De broncode voor de ingebouwde functies van Python is geschreven in c en is alleen toegankelijk door te kijken naar de broncode van Python (gehost op Mercurial of te downloaden van https://www.python.org/downloads/source/) .
print(inspect.getsource(sorted)) # raises a TypeError
type(sorted) # <class 'builtin_function_or_method'>