Sfortunatamente, nelle versioni Python precedenti al 3.4 il modulo dis
utilizza le istruzioni di stampa sullo stdout, quindi non restituirà nulla di direttamente utile. O si deve ri-implementare le funzioni dis
, disassemble
e disassemble_string
, o si sostituisce temporaneamente sys.stdout
con un'alternativa di catturare l'output:
import sys
from cStringIO import StringIO
out = StringIO()
stdout = sys.stdout
sys.stdout = out
try:
dis.dis()
finally:
sys.stdout = stdout
out = out.getvalue()
Questo in realtà è meglio farlo attraverso un gestore di contesto:
import sys
from contextlib import contextmanager
from cStringIO import StringIO
@contextmanager
def captureStdOut(output):
stdout = sys.stdout
sys.stdout = output
try:
yield
finally:
sys.stdout = stdout
out = StringIO()
with captureStdOut(out):
dis.dis()
print out.getvalue()
In questo modo è garantito il ripristino di stdout
anche se qualcosa va storto con dis
. Una piccola dimostrazione:
>>> out = StringIO()
>>> with captureStdOut(out):
... dis.dis(captureStdOut)
...
>>> print out.getvalue()
83 0 LOAD_GLOBAL 0 (GeneratorContextManager)
3 LOAD_DEREF 0 (func)
6 LOAD_FAST 0 (args)
9 LOAD_FAST 1 (kwds)
12 CALL_FUNCTION_VAR_KW 0
15 CALL_FUNCTION 1
18 RETURN_VALUE
In Python 3.4 e fino, le relative funzioni prendono un parametro file
per reindirizzare l'output:
from io import StringIO
with StringIO() as out:
dis.dis(file=out)
print(out.get_value())
fonte
2012-08-24 14:55:30
Perché non si desidera reindirizzare stdout (temporaneamente), come in [questa domanda] (http://stackoverflow.com/questions/1218933/can-i-redirect-the-stdout-in-python-into-some-sort-of-string-buffer)? –
Per Python 3.4 o versioni successive, esistono altre soluzioni. Vedi [questa domanda] (http://stackoverflow.com/q/31347044/3004881). –