当前位置: 首页 > 面试题库 >

捕获dis.dis结果

荆利
2023-03-14
问题内容

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

out=str(dis.dis())

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

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


问题答案:

不幸的是,在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())


 类似资料:
  • 我有一个存储过程似乎没有正确记录错误。 代码有错误,但 catch 块似乎未生效。 try块相当长,但错误部分很简单,并且在最后出现,所以我已经对此进行了预测。 proc失败的错误是我们的老朋友“列名或提供的值的数量与表定义不匹配”。我已经修复了这个错误 - 这是一个愚蠢的懒惰错误 - 但我感到困惑为什么我的错误日志记录过程似乎没有工作 - 没有行入到我的 ExtractsErrorLog 表中。

  • 问题内容: 我需要一种方法来干扰编写xsl结果文档,以避免将它们写入文件系统。现在我的模板正在写到一个临时目录,然后我压缩该目录。我想用这种方式写到文件系统。我正在使用撒克逊处理器。可以使用仅使用标准Java库的解决方案。任何建议表示赞赏。 编辑: 我发现了.net saxon api的此类http://www.saxonica.com/documentation/dotnetdoc/Saxon/

  • 问题内容: Java新手问题: 我需要捕获由第三方组件写入printStream的文本。 PrintStream默认为System.err,但可以更改为另一个PrintStream。 查看文档,我找不到将PrintStream的内容定向到字符串编写器/缓冲区的简单方法。 有人可以帮忙吗? 问题答案:

  • export class SearchService { ... .map((response) => response.json()) .catch((e) => { if (e.status >== 500) { return cachedVersion(); new Error(`${ e.status

  • 问题内容: 我想捕获到字符串的输出。 PHP文档说: 与将结果直接输出到浏览器的任何东西一样,输出控制功能可用于捕获此功能的输出,并将其保存在字符串中(例如)。 这可能如何工作的一个例子是什么? 这是不可能的,因为它不会给我所需的信息。 问题答案: 使用输出缓冲:

  • 我正在尝试在主组中的两个非捕获组之间捕获模式。 我怎么做? 这里是我的正则表达式的一部分:(?p(?:别名\s+?名称.).*?(?:\n)) 我的文本的一部分:别名:公司根CA\n 正确输出:公司根ca 那么谁能解释为什么它不起作用呢?