Я хотел бы проверить, установлен ли пользователем необязательный аргумент argparse или нет.
Могу ли я безопасно проверить с помощью isset?
Что-то вроде этого:
if(isset(args.myArg)):
#do something
else:
#do something else
Работает ли это так же для аргументов типа float / int / string?
Я мог бы установить параметр по умолчанию и проверить его (например, установить myArg = -1, или «» для строки, или «NOT_SET»). Однако значение, которое я в конечном итоге хочу использовать, вычисляется позже в сценарии. Поэтому я бы установил его на -1 по умолчанию, а затем обновил бы его на что-то другое позже. Это кажется немного неуклюжим по сравнению с простой проверкой того, было ли значение установлено пользователем.
isset()
было (подсказка: Python - это не PHP)? Возможно, вы имели в видуhasattr()
вместо этого? Почему бы вместо этого не настроить argparse для установки параметра по умолчанию?Ответы:
Я думаю, что необязательные аргументы (указанные с помощью
--
) инициализируются,None
если они не указаны. Так что вы можете протестировать с помощьюis not None
. Попробуйте пример ниже:источник
default
значение.default
, вы все равно можете установитьnargs='?'
и предоставитьconst
значение, как описано в документации . Когда arg отсутствует,default
используется, когда arg задано без значения, тогдаconst
используется, в противном случае используется заданное значение. С толькоdefault
иnargs='?'
,default
используется , если не дано,None
если дано без значения, в противном случае данное значение.action= "store_true"
илиaction="store_const", const="yourconst"
не можете использовать этот аргумент для хранения другого значения. При использовании значений по умолчанию это не сработает. В моем собственном я удалил все значения по умолчанию из argparser и обработал все внутри другой функции,def defaults():
где я смешиваю ConfigParser, ArgumentParser и значения по умолчанию в том порядке, в котором я хочуaction
. В ответе не используется расширениеaction
. Упомянутые вами действия задокументированы, чтобы вести себя одним определенным образом (как вы заметили). Однако необязательно определять действие.Как отмечает @Honza,
is None
это хороший тест. Это значение по умолчаниюdefault
, и пользователь не может дать вам строку, которая его дублирует.Вы можете указать другой
default='mydefaultvalue
и проверить это. Но что, если пользователь указывает эту строку? Это считается настройкой или нет?Вы также можете указать
default=argparse.SUPPRESS
. Затем, если пользователь не использует аргумент, он не появится вargs
пространстве имен. Но тестирование может быть более сложным:Внутри
parser
хранится списокseen_actions
и используется для «обязательного» и «взаимно исключающего» тестирования. Но он недоступен для вас извнеparse_args
.источник
Я думаю, что использование этой опции
default=argparse.SUPPRESS
имеет наибольший смысл. Затем вместо проверки, является ли аргументnot None
, проверяется, является ли аргументin
результирующим пространством имен.Пример:
Использование:
Аргумент не предоставляется:источник
testfoo.py: error: argument --foo: expected one argument
--foo
без значения (например,1
в моем примере), вы должны указатьnargs=0
вadd_argument
функции.action='store_true'
ответ ниже в своем фактическом коде.python argparse_test.py --foo 1
?Вы можете проверить необязательно переданный флаг с помощью параметров действия
store_true
иstore_false
аргумента:Таким образом, вам не нужно беспокоиться о проверке по условию
is not None
. Вы просто проверяетеTrue
илиFalse
. Подробнее об этих параметрах читайте в документации здесь.источник
Если ваш аргумент позиционный (то есть у него нет префикса «-» или «-», только аргумент, обычно имя файла), вы можете использовать параметр nargs для этого:
источник
Вот мое решение, чтобы узнать, использую ли я переменную argparse
Это может дать больше информации о приведенном выше ответе, который я использовал и адаптировал для работы в моей программе.
источник
Чтобы обратиться к комментарию @ kcpr к (принятому в настоящее время) ответу @Honza Osobne
сначала можно проверить, был ли предоставлен аргумент, сравнив его с
Namespace
объектом abd, предоставляющимdefault=argparse.SUPPRESS
параметр (см. ответы @ hpaulj и @Erasmus Cedernaes и этот документ python3 ), и, если он не был предоставлен, установите для него значение по умолчанию.использование
источник
Очень просто, после определения переменной args с помощью 'args = parser.parse_args ()' она также содержит все данные переменных подмножества args. Чтобы проверить, установлена ли переменная или нет, при условии, что используется 'action = "store_true" ...
источник