python-sys.stdout作為預設函式引數的實現
假設我們有以下虛擬函式:
import sys def writeline(text,stream=sys.stdout): stream.write(text + ' ') with open('/path/to/file','w') as f: # writes to /path/to/file writeline('foo',f) # writes to standard output writeline('bar')
鑑於Python在定義時評估了函式的預設引數,將sys.stdout設定為預設引數是安全的,還是會產生意想不到的副作用?
最佳答案
我想到的一個問題是,您有時有時想自己將sys.stdout重定向到檔案(或管道,裝置等).
例如,您的主程式可能如下所示:
if __name__ == '__main__': if len(sys.argv) > 1: sys.stdout = open(sys.argv[1],'w') try: # ... run the program finally: if len(sys.argv) > 1: sys.stdout.close()
如果您希望程式在提及一個檔案時將其記錄到一個檔案中(例如python3 file.py logfile.log),這可能會很有用.現在,由於您設定了sys.stdout,因此您的writeline方法將不會注意到該修改.
因此,我認為寫這樣更安全:
def writeline(text,stream = None): if stream is None: stream = sys.stdout stream.write(text + ' ')
通常,最好將不可變物件設定為預設引數(例如None,False,(1)等).只有在極少數情況下,Python中才會使用不可變的變數(或可能更改引用的變數).
但是,如果您確定不會將sys.stdout重定向到檔案,管道等,則是安全的.
補充拓展:Python 實現將sys.stdout還原為預設值
我想將輸出寫入檔案,因此我做了
sys.stdout = open(outfile,'w+')
但是後來我想在寫入檔案後列印回控制檯
sys.stdout.close()
sys.stdout = None
我得到了
AttributeError: 'NoneType' object has no attribute 'write'
顯然預設輸出流不能None,所以我對Python說:
sys.stdout = use_the_default_one()
解決方案
重新分配給sys.__stdout__。
來自文件
在程式開始時包含stdin,stderr和stdout的原始值。它們在完成過程中使用,並且無論是否已重定向sys.std *物件,將其列印到實際的標準流都很有用。
或者你可以做
print(output,file=myoutputfile)
並避免該問題。
以上這篇 python-sys.stdout作為預設函式引數的實現就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。