×
Traktatov.net » Язык программирования Python » Читать онлайн
Страница 133 из 141 Настройки
модуля >dis выводит код функции >f() в виде некого «ассемблера», в котором байт-код Python представлен мнемоническими именами. Следует заметить, что при интерпретации используется стек, поэтому >LOAD_CONST кладет значение на вершину стека, а >BINARY_MULTIPLY берет со стека два значения и помещает на стек результат их перемножения. Функция без оператора >return возвращает значение >None. Как и в случае с кодами для микропроцессора, некоторые байт-коды принимают параметры.

Мнемонические имена можно увидеть в списке >dis.opname (ниже печатаются только задействованные имена):

>>>> import dis

>>>> [n for n in dis.opname if n[0] != "<"]

>['STOP_CODE', 'POP_TOP', 'ROT_TWO', 'ROT_THREE', 'DUP_TOP', 'ROT_FOUR',

>'NOP', 'UNARY_POSITIVE', 'UNARY_NEGATIVE', 'UNARY_NOT', 'UNARY_CONVERT',

>'UNARY_INVERT', 'LIST_APPEND', 'BINARY_POWER', 'BINARY_MULTIPLY',

>'BINARY_DIVIDE', 'BINARY_MODULO', 'BINARY_ADD', 'BINARY_SUBTRACT',

>'BINARY_SUBSCR', 'BINARY_FLOOR_DIVIDE', 'BINARY_TRUE_DIVIDE',

>'INPLACE_FLOOR_DIVIDE', 'INPLACE_TRUE_DIVIDE', 'SLICE+0', 'SLICE+1',

>'SLICE+2', 'SLICE+3', 'STORE_SLICE+0', 'STORE_SLICE+1', 'STORE_SLICE+2',

>'STORE_SLICE+3', 'DELETE_SLICE+0', 'DELETE_SLICE+1', 'DELETE_SLICE+2',

>'DELETE_SLICE+3', 'INPLACE_ADD', 'INPLACE_SUBTRACT', 'INPLACE_MULTIPLY',

>'INPLACE_DIVIDE', 'INPLACE_MODULO', 'STORE_SUBSCR', 'DELETE_SUBSCR',

>'BINARY_LSHIFT', 'BINARY_RSHIFT', 'BINARY_AND', 'BINARY_XOR', 'BINARY_OR',

>'INPLACE_POWER', 'GET_ITER', 'PRINT_EXPR', 'PRINT_ITEM', 'PRINT_NEWLINE',

>'PRINT_ITEM_TO', 'PRINT_NEWLINE_TO', 'INPLACE_LSHIFT', 'INPLACE_RSHIFT',

>'INPLACE_AND', 'INPLACE_XOR', 'INPLACE_OR', 'BREAK_LOOP', 'LOAD_LOCALS',

>'RETURN_VALUE', 'IMPORT_STAR', 'EXEC_STMT', 'YIELD_VALUE', 'POP_BLOCK',

>'END_FINALLY', 'BUILD_CLASS', 'STORE_NAME', 'DELETE_NAME',

>'UNPACK_SEQUENCE', 'FOR_ITER', 'STORE_ATTR', 'DELETE_ATTR', 'STORE_GLOBAL',

>'DELETE_GLOBAL', 'DUP_TOPX', 'LOAD_CONST', 'LOAD_NAME', 'BUILD_TUPLE',

>'BUILD_LIST', 'BUILD_MAP', 'LOAD_ATTR', 'COMPARE_OP', 'IMPORT_NAME',

>'IMPORT_FROM', 'JUMP_FORWARD', 'JUMP_IF_FALSE', 'JUMP_IF_TRUE',

>'JUMP_ABSOLUTE', 'LOAD_GLOBAL', 'CONTINUE_LOOP', 'SETUP_LOOP',

>'SETUP_EXCEPT', 'SETUP_FINALLY', 'LOAD_FAST', 'STORE_FAST', 'DELETE_FAST',

>'RAISE_VARARGS', 'CALL_FUNCTION', 'MAKE_FUNCTION', 'BUILD_SLICE',

>'MAKE_CLOSURE', 'LOAD_CLOSURE', 'LOAD_DEREF', 'STORE_DEREF',

>'CALL_FUNCTION_VAR', 'CALL_FUNCTION_KW', 'CALL_FUNCTION_VAR_KW',

>'EXTENDED_ARG']

Легко догадаться, что >LOAD означает загрузку значения в стек, >STORE — выгрузку, >PRINT — печать, >BINARY — бинарную операцию и т.п.

Отладка

В интерпретаторе языка Python заложены возможности отладки программ, а в стандартной поставке имеется простейший отладчик>pdb. Следующий пример показывает программу, которая подвергается отладке, и типичную сессию отладки:

># File myfun.py

>def fun(s):

> lst = []

> for i in s:

>  lst.append(ord(i))

> return lst

Так может выглядеть типичный процесс отладки:

>>>> import pdb, myfun

>>>> pdb.runcall(myfun.fun, «ABCDE»)

>> /examples/myfun.py(4)fun()

>-> lst = []

>(Pdb) n

>> /examples/myfun.py(5)fun()

>-> for i in s:

>(Pdb) n

>> /examples/myfun.py(6)fun()