Самый надежный способ определить, предоставил ли пользователь значение, - оставить значение по умолчанию None
.Пользователь не может сказать, что он произведет то же самое.Затем после разбора все, что вам нужно сделать, это:
if args.myval is None:
# no user input, set my own special default
else:
# user value
Если вы установите default=argparse.SUPPRESS
, атрибут будет опущен из пространства имен args
.Но тестирование для этого случая немного более неловко.
args.myval
вызовет ошибку, которую вы можете поймать.Или вы можете использовать hasattr(args, 'myval'). Or handle the missing key in
vars (args) `.
Внутренне parse_args
поддерживает список (на самом деле set
) действий, которые он" видел ".Это используется для проверки необходимых действий.Но это не доступно для пользователей.Если бы это было возможно, опытные пользователи могли бы выполнять более широкий спектр совместных тестов.
In [28]: import argparse
In [29]: parser = argparse.ArgumentParser()
In [30]: a1 = parser.add_argument('-f','--foo')
Тест без значения:
In [31]: args = parser.parse_args([])
In [32]: args
Out[32]: Namespace(foo=None) # foo is present
In [33]: args.foo is None
Out[33]: True
Измените значение по умолчанию на SUPPRESS
:
In [35]: a1.default = argparse.SUPPRESS
In [36]: args = parser.parse_args([])
In [37]: args
Out[37]: Namespace() # foo is missing
In [38]: args.foo
AttributeError: 'Namespace' object has no attribute 'foo'
Мы можем поместить args.foo
в блок try: except AttributeError
.
In [39]: hasattr(args, 'foo')
Out[39]: False
Или проверить словарь на наличие пропущенных значений
In [46]: vars(args)
Out[46]: {}
In [47]: vars(args).get('foo') is None
Out[47]: True
In [48]: 'foo' in vars(args)
Out[48]: False
По умолчанию наиболее полезнокогда он предоставляет действительное, полезное значение и избавляет вас от лишнего тестирования после анализа.