сам объект анализатора сохраняет некоторую полезную информацию, которую мы можем используйте, чтобы проверить значения по умолчанию, которые мы назначили при добавлении аргумента.
Пример скрипта 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
по желанию.
person
lhuber
schedule
06.07.2017