python-sys.stdout作為默認函數(shù)參數(shù)的實現(xiàn)
假設(shè)我們有以下虛擬函數(shù):
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在定義時評估了函數(shù)的默認參數(shù),將sys.stdout設(shè)置為默認參數(shù)是安全的,還是會產(chǎn)生意想不到的副作用?
最佳答案
我想到的一個問題是,您有時有時想自己將sys.stdout重定向到文件(或管道,設(shè)備等).
例如,您的主程序可能如下所示:
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),這可能會很有用.現(xiàn)在,由于您設(shè)置了sys.stdout,因此您的writeline方法將不會注意到該修改.
因此,我認為寫這樣更安全:
def writeline(text, stream = None): if stream is None: stream = sys.stdout stream.write(text + ' ')
通常,最好將不可變對象設(shè)置為默認參數(shù)(例如None,False,(1)等).只有在極少數(shù)情況下,Python中才會使用不可變的變量(或可能更改引用的變量).
但是,如果您確定不會將sys.stdout重定向到文件,管道等,則是安全的.
補充拓展:Python 實現(xiàn)將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作為默認函數(shù)參數(shù)的實現(xiàn)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python實現(xiàn)監(jiān)聽目錄并取消文件只讀屬性
這篇文章主要為大家詳細介紹了如何利用Python實現(xiàn)監(jiān)聽目錄并取消文件只讀屬性,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2023-07-07
Python調(diào)用PC攝像頭實現(xiàn)掃描二維碼
PC攝像機掃描二維碼的應(yīng)用場景很廣泛,可以應(yīng)用于各種需要快速掃描、識別和管理的場景,本文就來具體講講如何用Python實現(xiàn)這一功能吧2023-05-05
pandas 數(shù)據(jù)索引與選取的實現(xiàn)方法
這篇文章主要介紹了pandas 數(shù)據(jù)索引與選取的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-06-06
python爬蟲之urllib,偽裝,超時設(shè)置,異常處理的方法
今天小編就為大家分享一篇python爬蟲之urllib,偽裝,超時設(shè)置,異常處理的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12

