如何编写可以从函数返回的内容

时间:2019-10-16 02:26:48

标签: python file printing

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

有没有一种方法可以打印出可以从函数返回的内容(不确定什么!),并且只需在调用脚本中使用两个打印语句进行打印?

所以代替:

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)

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

也许这就是答案-我只是看不到如何以整洁的pythonic方式进行操作。

1 个答案:

答案 0 :(得分:0)

最简单的方法是定义自己的打印函数并调用它,而不是调用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)

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


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

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