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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow