1. 程式人生 > 程式設計 >python-sys.stdout作為預設函式引數的實現

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作為預設函式引數的實現就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。