Поиск…


Отображение байт-кода функции

Интерпретатор 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 в модуле 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 (размещенном на Mercurial или загружаемом с 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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow