【问题标题】:Assign a function output prints to a variable in python将函数输出分配给python中的变量
【发布时间】:2017-01-05 19:33:56
【问题描述】:

我有一个打印结果的函数(在某些项目中)。当我从命令行或另一个 python 项目中调用它时,它会在终端上打印输出。但我想将所有打印结果存储在一个变量中,如下所示:

output = function_name(function_args)

我不想在终端上打印结果,而是将它们存储在output 变量中。 此外,主函数返回一些东西(只是一个数字作为状态)作为我不想要那个数字的结果。

【问题讨论】:

  • 为什么不修复函数以返回结果而不是打印?
  • 这可能是用户无法修改的库代码。给予怀疑的好处!
  • @wim 出于我自己的好奇心,这是什么时候出现的?只是公司不允许,还是 python 固有的某个地方存在实际限制?
  • 有很多可能的情况——有时你只是有包装.so文件(编译代码)的python接口。有时会有 .pyc-only 发行版作为(弱)尝试混淆源代码。有时代码应该打印到标准输出,而您需要在测试中捕获值,您无需修改​​被测代码。

标签: python terminal output


【解决方案1】:

你可以通过重新绑定sys.stdout来做到这一点:

>>> def foo():
...     print('potato')
... 
>>> import sys, io
>>> sys.stdout = io.StringIO()
>>> foo()
>>> val = sys.stdout.getvalue()
>>> sys.stdout = sys.__stdout__  # restores original stdout
>>> print(val)
potato

要获得更好的方法,请考虑编写上下文管理器。如果您使用的是 Python 3.4+,则为 already been written for you

>>> from contextlib import redirect_stdout
>>> f = io.StringIO()
>>> with redirect_stdout(f):
...     foo()
... 
>>> print(f.getvalue())
potato

如果您能够修改函数本身,则允许对输出流进行依赖注入可能会更简洁(这只是说“传递参数”的一种奇特方式):

def foo(file=sys.stdout):
    print('potato', file=file)

【讨论】:

    【解决方案2】:

    明智的解决方案简单明了:修复函数,使其返回正确的数据,而不是打印它。否则,您可以使用 wim 发布的 hack,但假设您掌握了采用这种复杂解决方案的错误功能,则属于“WTF”类别。

    当然,如果您不了解函数的代码,或者它只是一个 5 分钟的一次性脚本,那么捕获 sys.stdout 是一个方便的后备方案。

    【讨论】:

      猜你喜欢
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 2016-09-05
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多