捕获dis.dis结果

IT *_*nja 15 python python-2.7

有没有办法在dis.dis()没有重定向的情况下获得输出sys.stdout?我试过了:

out=str(dis.dis())
Run Code Online (Sandbox Code Playgroud)

out=""""""
out+=str(dis.dis())
Run Code Online (Sandbox Code Playgroud)

但是我很快发现它又回来了None.有没有什么办法解决这一问题?

Mar*_*ers 23

不幸的是,在3.4之前的Python版本中,dis模块使用stdout的print语句,所以它不会返回任何直接有用的东西.要么你必须重新实现dis,disassembledisassemble_string功能,或者你暂时代替sys.stdout一个替代捕获输出:

import sys
from cStringIO import StringIO

out = StringIO()
stdout = sys.stdout
sys.stdout = out
try:
    dis.dis()
finally:
    sys.stdout = stdout
out = out.getvalue()
Run Code Online (Sandbox Code Playgroud)

这实际上最好使用上下文管理器完成:

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()
Run Code Online (Sandbox Code Playgroud)

这样,stdout即使出现问题,您也可以保证恢复dis.一点点演示:

>>> 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        
Run Code Online (Sandbox Code Playgroud)

在Python 3.4及更高版本中,相关函数采用file参数将输出重定向到:

from io import StringIO

with StringIO() as out:
    dis.dis(file=out)
    print(out.getvalue())
Run Code Online (Sandbox Code Playgroud)

  • @agf:在编写通用代码时,你需要考虑那些极端情况.来自SO的答案的代码被全部复制,所以我尝试编写可以*全部使用*的东西.:-) (4认同)