Модуль dis

Введение

Примеры

  • 1

    Константы в модуле dis

     EXTENDED_ARG = 145 # All opcodes greater than this have 2 operands
    HAVE_ARGUMENT = 90 # All opcodes greater than this have at least 1 operands
    
    cmp_op = ('<', '<=', '==', '!=', '>', '>=', 'in', 'not in', 'is', 'is ...
           # A list of comparator id's. The indecies are used as operands in some opcodes
    
    # All opcodes in these lists have the respective types as there operands
    hascompare = [107]
    hasconst = [100]
    hasfree = [135, 136, 137]
    hasjabs = [111, 112, 113, 114, 115, 119]
    hasjrel = [93, 110, 120, 121, 122, 143]
    haslocal = [124, 125, 126]
    hasname = [90, 91, 95, 96, 97, 98, 101, 106, 108, 109, 116]
    
    # A map of opcodes to ids
    opmap = {'BINARY_ADD': 23, 'BINARY_AND': 64, 'BINARY_DIVIDE': 21, 'BIN...
    # A map of ids to opcodes
    opname = ['STOP_CODE', 'POP_TOP', 'ROT_TWO', 'ROT_THREE', 'DUP_TOP', '... 
  • 1

    Что такое байт-код Python?

    Python - это гибридный интерпретатор. При запуске программы, она первая монтирует его в байт - код , который затем может быть запущен в интерпретаторе Python (также называемой виртуальной машины Python). dis модуль в стандартной библиотеке можно использовать , чтобы сделать Python байткодом читаемый человеком разборкой классы, методы, функции и объекты кода.

     >>> def hello():
    ...     print "Hello, World"
    ...
    >>> dis.dis(hello)
      2           0 LOAD_CONST               1 ('Hello, World')
                  3 PRINT_ITEM
                  4 PRINT_NEWLINE
                  5 LOAD_CONST               0 (None)
                  8 RETURN_VALUE
    
    
     

    Интерпретатор Python основан на стеке и использует систему «первым пришел - последним вышел».

    Каждый код операции (код операции) на языке ассемблера Python (байт-код) берет фиксированное количество элементов из стека и возвращает фиксированное количество элементов в стек. Если в стеке недостаточно элементов для кода операции, интерпретатор Python завершится сбоем, возможно, без сообщения об ошибке.

  • 0

    Разборка модулей

    Чтобы разобрать модуль Python, первое это должно быть превращено в .pyc файл (Python скомпилирован). Для этого запустите

     python -m compileall <file>.py
    
     

    Затем в переводчике запустите

     import dis
    import marshal
    with open("<file>.pyc", "rb") as code_f:
        code_f.read(8) # Magic number and modification time
        code = marshal.load(code_f) # Returns a code object which can be disassembled
        dis.dis(code) # Output the disassembly
    
     

    Это будет компилировать модуль Python и вывод инструкцию байткода с dis . Модуль никогда не импортируется, поэтому его можно использовать с недоверенным кодом.

Синтаксис

Параметры

Примечания