捕获dis.dis结果

发布于 2021-01-29 17:40:48

有没有办法获得输出而dis.dis()无需重定向sys.stdout?我试过了:

out=str(dis.dis())

out=""""""
out+=str(dis.dis())

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

关注者
0
被浏览
42
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    不幸的是,在3.4之前的Python版本中,该dis模块使用print语句进行stdout,因此它不会返回任何直接有用的东西。要么你不得不重新实施disdisassembledisassemble_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()
    

    实际上,最好使用上下文管理器完成此操作:

    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()
    

    这样,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
    

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

    from io import StringIO
    
    with StringIO() as out:
        dis.dis(file=out)
        print(out.getvalue())
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看