Python argparse — Определяет, передается ли аргумент списка без каких-либо последствий

#python #list #argparse

Вопрос:

Допустим, пользователь вводит:

./args.py --create --mem 5

и мой парсер выглядит так:

parser.add_argument('--create', nargs='*', default=None)

Обычно --create принимает список с nargs='*' , однако в этом случае пользователь ничего не передал.

Я бы хотел, чтобы --create при вызове было установлено значение по умолчанию, вместо этого я получаю []

Вопрос: Можно ли в любом случае определить, --create отображается ли в аргументах командной строки что-либо после этого?

Комментарии:

1. create устанавливается в список следующих строк. С » * » этот список может быть пустым, [] .

2. Хитрость в том, что create = default когда не пройдено и create = [] когда пройдено без чего-либо последующего. Я ожидал, что все будет наоборот.

3. Поэтому теперь мой код ищет [] вместо значения по умолчанию.

4. Значение по умолчанию для a positional с `nargs=’*’ является особенно сложным, так как «ничто» не удовлетворяет его требованиям.. Это всегда видно, даже когда нет никаких строк.

Ответ №1:

Вот простой фрагмент кода:

 import argparse


parser = argparse.ArgumentParser()
parser.add_argument('--create', nargs='*', default=None)
options = parser.parse_args()
print(options)
 

Вот несколько взаимодействий:

 $ ./args.py 
Namespace(create=None)

$ ./args.py --create
Namespace(create=[])

$ ./args.py --create one
Namespace(create=['one'])

$ ./args.py --create one two
Namespace(create=['one', 'two'])
 

Как вы можете видеть, если пользователь не добавляет --create флаг, то это так None . Если пользователь использует --create флаг без ничего, вы получите пустой список.