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

Введение

Примеры

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

    Интерпретатор Python компилирует код в байт - код перед выполнением его на виртуальной машине Python (смотрите также https://codecamp.ru/documentation/python/1763/the-dis-module/5729/what-is-python-bytecode#t= 201609280954269606205 ).

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

Синтаксис

Параметры

Примечания