使用装饰器。简化示例:
def my_decorator(func):
def wrapped_func(*args,**kwargs):
return func("I've been decorated!",*args,**kwargs)
return wrapped_func
print = my_decorator(print)
Test:
print("TESTING") #I've been decorated! TESTING
因此,要同时打印到文件,您可以这样做:
def super_print(filename):
'''filename is the file where output will be written'''
def wrap(func):
'''func is the function you are "overriding", i.e. wrapping'''
def wrapped_func(*args,**kwargs):
'''*args and **kwargs are the arguments supplied
to the overridden function'''
#use with statement to open, write to, and close the file safely
with open(filename,'a') as outputfile:
outputfile.write(*args,**kwargs)
#now original function executed with its arguments as normal
return func(*args,**kwargs)
return wrapped_func
return wrap
print = super_print('output.txt')(print)
如果将此与上面的示例进行比较,您会发现在这种情况下有一个额外的闭包(即,return wrapped_func
AND return wrap
而不仅仅是return wrapped_func
)。第二个闭包允许我们发送一个附加参数(filename
) 到包装器/装饰器函数中。
最后一行的语法看起来有点奇怪,但这是正确的方法。致电给super_print('output.txt')
返回一个对象,然后给定该对象print
函数对象作为附加参数。整个事情是通过闭包进行的;如果您跟不上进度,请研究一下。
Then:
print('test')
test
将被写入控制台输出和output.txt。