python-sys.stdout作為默認(rèn)函數(shù)參數(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ù)的默認(rèn)參數(shù),將sys.stdout設(shè)置為默認(rèn)參數(shù)是安全的,還是會(huì)產(chǎn)生意想不到的副作用?
最佳答案
我想到的一個(gè)問題是,您有時(shí)有時(shí)想自己將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()
如果您希望程序在提及一個(gè)文件時(shí)將其記錄到一個(gè)文件中(例如python3 file.py logfile.log),這可能會(huì)很有用.現(xiàn)在,由于您設(shè)置了sys.stdout,因此您的writeline方法將不會(huì)注意到該修改.
因此,我認(rèn)為寫這樣更安全:
def writeline(text, stream = None): if stream is None: stream = sys.stdout stream.write(text + ' ')
通常,最好將不可變對象設(shè)置為默認(rèn)參數(shù)(例如None,False,(1)等).只有在極少數(shù)情況下,Python中才會(huì)使用不可變的變量(或可能更改引用的變量).
但是,如果您確定不會(huì)將sys.stdout重定向到文件,管道等,則是安全的.
補(bǔ)充拓展:Python 實(shí)現(xiàn)將sys.stdout還原為默認(rèn)值
我想將輸出寫入文件,因此我做了
sys.stdout = open(outfile, 'w+')
但是后來我想在寫入文件后打印回控制臺(tái)
sys.stdout.close()
sys.stdout = None
我得到了
AttributeError: 'NoneType' object has no attribute 'write'
顯然默認(rèn)輸出流不能None,所以我對Python說:
sys.stdout = use_the_default_one()
解決方案
重新分配給sys.__stdout__。
在程序開始時(shí)包含stdin,stderr和stdout的原始值。它們在完成過程中使用,并且無論是否已重定向sys.std *對象,將其打印到實(shí)際的標(biāo)準(zhǔn)流都很有用。
或者你可以做
print(output, file=myoutputfile)
并避免該問題。
以上這篇 python-sys.stdout作為默認(rèn)函數(shù)參數(shù)的實(shí)現(xiàn)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python中執(zhí)行shell的兩種方法總結(jié)
這篇文章主要介紹了python中執(zhí)行shell的兩種方法,有兩種方法可以在Python中執(zhí)行SHELL程序,方法一是使用Python的commands包,方法二則是使用subprocess包,這兩個(gè)包均是Python現(xiàn)有的內(nèi)置模塊。需要的朋友可以參考借鑒,下面來一起看看吧。2017-01-01python Bamboolib庫加速Pandas數(shù)據(jù)分析過程詳解
這篇文章主要介紹了python Bamboolib庫加速Pandas數(shù)據(jù)分析過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Python 根據(jù)相鄰關(guān)系還原數(shù)組的兩種方式(單向構(gòu)造和雙向構(gòu)造)
本文主要介紹了Python 根據(jù)相鄰關(guān)系還原數(shù)組的兩種方式,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07基于python實(shí)現(xiàn)名片管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了基于python實(shí)現(xiàn)名片管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11Python實(shí)現(xiàn)求解括號(hào)匹配問題的方法
這篇文章主要介紹了Python實(shí)現(xiàn)求解括號(hào)匹配問題的方法,涉及Python基于棧的字符串遍歷、判斷、運(yùn)算解決括號(hào)匹配相關(guān)操作技巧,需要的朋友可以參考下2018-04-04