2017-02-17 52 views
1

​​將選項的參數應用於類型轉換,如果默認值是字符串,則應用這些參數的默認值。然而,現在看來,這並沒有對定位參數做到:如何將argparse應用類型轉換爲位置參數的默認值?

import argparse as ap 

p = ap.ArgumentParser() 
p.add_argument('file', nargs='*', 
       metavar='FILE', 
       default='-', 
       type=ap.FileType(), 
       help='Input files. - is stdin. Default: %(default)s') 

print(p.parse_args([])) 
# Namespace(file='-') 
print(p.parse_args(['-'])) 
# Namespace(file=[<_io.TextIOWrapper name='<stdin>' mode='r' encoding='UTF-8'>]) 

Ideone

如果我改變file--file,使這些選項參數,如預期的那樣default值轉換。

作爲default,我有沒有比明確通過argparse.FileType()('-')更好的選擇?

回答

1

放入sys.argv的值始終爲str對象,因爲底層操作系統構造是一個數組,是C字符指針。您需要type將它們轉換爲其他Python類型。

然而,default的值沒有這樣的限制。您可以爲該關鍵字參數使用您喜歡的任何類型的值。

p.add_argument('file', 
       nargs='*', 
       metavar='FILE', 
       default=[sys.stdin], 
       type=ap.FileType(), 
       help='Input files. - is stdin. Default: standard input') 

我修改了幫助;獲取repr(sys.stdin)的值不是特別有用,並且用戶不應該通過描述默認值而不是混淆,而不是指定確切的Python對象。

+0

我很理解第一部分,但我不明白這與此有什麼關係。至於第二個,如果我使用的默認文件是''/ some/file''而不是'' - ''呢? – muru

+0

'default = ap.FileType('/ some/file')'。默認值不會受到定義類型的處理。 – chepner

+0

(我正在檢查源代碼,但是,以確保我不會錯過任何東西,這是一個複雜的過程。) – chepner

相關問題