Python Language
Dostęp do kodu źródłowego i kodu bajtowego Pythona
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'>