如果我有一个包含大量打印语句的函数:
即.
def funA():
print "Hi"
print "There"
print "Friend"
print "!"
我想做的是这样的事情
def main():
##funA() does not print to screen here
a = getPrint(funA()) ##where getPrint is some made up function/object
print a ##prints what funA would normally print at this step
因此,当调用funcA时,它不会进行任何打印,而是输出到对象.然后我打印对象以获得结果.有办法做到这一点吗?我也不想触摸原来的功能.
我希望这是有道理的.
解决方法:
只要您不介意微小的语法差异,您几乎可以完全按照自己的意愿行事:
import cStringIO
import sys
def getPrint(thefun, *a, **k):
savstdout = sys.stdout
sys.stdout = cStringIO.StringIO()
try:
thefun(*a, **k)
finally:
v = sys.stdout.getvalue()
sys.stdout = savstdout
return v
微小的区别在于你必须调用getPrint(funA),而不是getPrint(funA()) – 也就是说,你必须传递函数对象本身,而不会在getPrint发挥其魔力之前立即调用它的尾随括号.
如果你绝对坚持那些额外的括号,那么getPrint不能做所有必要的准备工作,并且必须通过其他代码来补充以正确准备(我强烈建议丢失额外的括号,从而能够封装getPrint中的所有功能!) .
标签:python
来源: https://codeday.me/bug/20190713/1452379.html