如果我有一個包含大量打印語句的函數:
即.
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