parser object itself保存了一些有用的信息,我們可以使用它們查看添加參數時分配的默認值。
示例腳本parser_ex.py
:
import argparse
def specified_nondefault(opts, parser, arg):
"""
Checks whether an argument was specified to be something other than the
default value.
..Note: This doesn't actually check if the argument was specified, as it
can be 'tricked' by the user specifying the default value.
:param argparse.Namespace opts: Parsed arguments to check.
:param argparse.Parser parser: The parser they were parsed with.
:param str arg: The name of the argument in question.
:return bool: Whether the current argument value differs from the default.
"""
if getattr(opts, arg) == parser.get_default(arg):
return False
return True
parser = argparse.ArgumentParser()
parser.add_argument('enabled_features', nargs='*', default=['A', 'B', 'C', 'D'])
opts = parser.parse_args()
print specified_nondefault(opts, parser, 'enabled_features')
在這種情況下:
>> parser_ex.py 'B' True
因爲我們已經做了一些非默認。雖然
>> parser_ex.py 'A' 'B' 'C' 'D' False
和
>> parser_ex.py False
由於這只是有默認輸入。
注意,因爲我們正在檢查針對整個列表,有一些稍微不良行爲的順序問題和
>> parser_ex.py 'B' 'A' 'C' True
IMO,這是結塊的所有功能集成到一個單一的參數有問題,但是如果你在意的話,你肯定可以以某種方式繞過它。
然後,如果用戶已經/未指定不確定enabled_features
,您可以根據需要根據IP
更改它們。
我承認更改默認值通常隱含是一個壞主意,並設置默認爲無使它更加明確。 然而,在許多情況下,解析後更改默認值的想法是,如果不是最好的,最明顯的事情...... – Mathias
請注意,所有的值不一定會在默認情況下有沒有一個默認值,如果正在使用諸如store_true之類的操作。 – AdamC
'store_true'默認是'False',這同樣合理。如果命令行可以提供與默認相同的測試值,則只會產生歧義。 – hpaulj