Szukaj…


Wyświetl kod bajtowy funkcji

Interpreter języka Python kompiluje kod do kodu bajtowego przed uruchomieniem go na maszynie wirtualnej Pythona (zobacz także Co to jest kod bajtowy Pythona?

Oto jak wyświetlić kod bajtowy funkcji Python

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)

Funkcja dis.dis w module dis zwróci dis.dis kod bajtowy przekazanej do niej funkcji.

Eksploracja obiektu kodu funkcji

CPython umożliwia dostęp do obiektu kodu dla obiektu funkcji.

Obiekt __code__ zawiera nieprzetworzony kod bajtowy ( co_code ) funkcji, a także inne informacje, takie jak stałe i nazwy zmiennych.

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__)

Wyświetl kod źródłowy obiektu

Obiekty, które nie są wbudowane

Aby wydrukować kod źródłowy obiektu Python, użyj inspect . Pamiętaj, że to nie zadziała dla obiektów wbudowanych ani dla obiektów zdefiniowanych interaktywnie. W tym celu potrzebne będą inne metody wyjaśnione później.

Oto jak wydrukować kod źródłowy metody randint z random modułu:

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)

Aby wydrukować ciąg dokumentacji

print(inspect.getdoc(random.randint))
# Output:
# Return random integer in range [a, b], including both end points.

Wydrukuj pełną ścieżkę do pliku, w którym zdefiniowano metodę random.randint :

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

Obiekty zdefiniowane interaktywnie

Jeśli obiekt jest zdefiniowany interaktywnie, inspect nie może dostarczyć kodu źródłowego, ale zamiast tego można użyć dill.source.getsource

# 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

Wbudowane obiekty

Kod źródłowy dla wbudowanych funkcji Pythona jest napisany w c, a dostęp do niego można uzyskać tylko patrząc na kod źródłowy Pythona (hostowany na Mercurial lub do pobrania ze strony 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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow