Я пытаюсь сравнить байт-код двух вещей с difflib, но dis.dis() всегда печатает его на консоли. Любой способ получить вывод в строке?
Получите результаты dis.dis() в строке
Ответ 1
Использует StringIO для переопределения std в объект типа string (решение python 2.7)
import sys
import StringIO
import dis
def a():
print "Hello World"
stdout = sys.stdout # Hold onto the stdout handle
f = StringIO.StringIO()
sys.stdout = f # Assign new stdout
dis.dis(a) # Run dis.dis()
sys.stdout = stdout # Reattach stdout
print f.getvalue() # print contents
Ответ 2
Если вы используете Python 3.4 или новее, вы можете получить эту строку, используя метод Bytecode.dis()
:
>>> s = dis.Bytecode(lambda x: x + 1).dis()
>>> print(s)
1 0 LOAD_FAST 0 (x)
3 LOAD_CONST 1 (1)
6 BINARY_ADD
7 RETURN_VALUE
Вы также можете взглянуть на dis.get_instructions()
, который возвращает итератор именованных кортежей, каждый из которых соответствует инструкции байт-кода.