【问题标题】:How to write to something that can be returned from a function如何写入可以从函数返回的内容
【发布时间】:2019-10-16 02:26:48
【问题描述】:

我有一个可以进行大量打印的功能。我希望这些到标准输出以及到一个文件,所以我目前必须复制每个打印:一次用于标准输出,一次用于文件。

有没有一种方法可以打印到某些东西(不确定是什么!),我可以从函数返回并在调用脚本中使用两个打印语句简单地打印?

所以而不是:

def func():
   print("1")
   print("1",file=out.txt)
   print("2")
   print("2",file=out.txt)
   print("3")
   print("3",file=out.txt)
   return()

我想要类似的东西:

def func2():
   print("1",  ???) ->string.out
   print("2",  ???) ->string.out
   print("3",  ???) ->string.out
   (or some such?)
   return(string.out)

func2()
print(string.out)
print(string.out,file=out.txt)

我知道我可以通过将所有输出附加到字符串来以粗略的方式做到这一点,但这将涉及“打印”处理的大量格式(例如,使用模板)。

或者也许这就是答案——我只是看不出如何以一种简洁的 Python 风格来做到这一点。

【问题讨论】:

  • 你为什么不直接使用tee 命令?
  • 我不认为我理解这个问题。为什么不能定义自己的 my_print 函数,将相同的内容打印到标准输出和文件?
  • 所以基本上你想要的是控制台和文件同时输出?
  • 您可以“重载”builtins.print。看这里:stackoverflow.com/questions/46658639/…
  • multiprint 函数可以工作,但我正在寻找可以在主程序中打印的东西(出于各种原因)。

标签: python file printing


【解决方案1】:

最简单的方法是定义自己的打印函数并调用它而不是调用print

def multiprint(data, *files):
    print(data)  # prints out to stdout
    for file in files:
        print(data, stdout=file)

你可以把这个函数称为:

multiprint("print this", file1, file1, file3)

您所要做的就是用multiprint 调用替换所有print 函数调用。


或者,您可以编写一个装饰器,但这将是一种可怕的方法。

from functools import wraps
import sys

def multiprint(*files):
    def printnew(func):
        @wraps(func)
        def inner():
            func()
            _stdout = sys.stdout
            for file in files:
                sys.stdout = file  # a bit of dirty monkey patching
                func()
            sys.stdout = _stdout
        return inner
    return printnew


@multiprint(file1, file2)
def f():
    print('first')
    print('second')

f()  # first and second will be printed to stdout and into both file1 and file2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    相关资源
    最近更新 更多