Документация по Python

Доступ к исходному коду Python и байт-коду

В: Документация по Python

Показать байт-код функции

Интерпретатор Python компилирует код в байт - код перед выполнением его на виртуальной машине Python.

Вот как просмотреть байт-код функции 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)

 

Функция dis.dis в модуле Дис возвратит декомпилированный байткод функции переданного ему.

Изучение объекта кода функции

CPython разрешает доступ к объекту кода для объекта функции.

__code__ объект содержит необработанный байт - код ( co_code ) функции, а также другую информацию , такую как константы и имена переменных.

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

Показать исходный код объекта Объекты, которые не являются встроенными

Чтобы напечатать исходный код использования объекта в Python inspect.Обратите внимание, что это не будет работать ни для встроенных объектов, ни для объектов, определенных в интерактивном режиме. Для этого вам понадобятся другие методы, объясненные позже.

Вот как напечатать исходный код метода randint от random модуля:

 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) 

Просто напечатать строку документации

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

Печать полный путь к файлу , в котором метод 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 

Объекты, определенные в интерактивном режиме

Если объект определен в интерактивном режиме inspect не может предоставить исходный код , но вы можете использовать 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 

Встроенные объекты

Исходный код для встроенных функций Python написано на C и может быть доступен только глядя на исходном коде языка Python (размещенные на ртутном или загрузить с https://www.python.org/downloads/source/ ).

 print(inspect.getsource(sorted)) # raises a TypeError
type(sorted) # <class 'builtin_function_or_method'> 

Еще от кодкамп
Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.