Argparse позиционный аргумент '*' - PullRequest
0 голосов
/ 22 декабря 2018

Мне нужно проанализировать командную строку, как показано ниже

script.py apple banana -l list pineapple

Плоды должны идти в список, а флаг -n - к другому флагу

Я пытаюсь решить эту проблемус

parser = argparse.ArgumentParser()
parser.add_argument('fruit', nargs = '*')
parser.add_argument('-l', dest = ls)

Используя этот пример, я получил следующую ошибку: нераспознанные аргументы pineapple

Обратите внимание, используя

script.py apple banana -l list

Работает нормально

Использование nargs= argparse.REMAINDER даёт странное поведение.

Все параметры были помещены в список "фруктов".

Спасибо

1 Ответ

0 голосов
/ 22 декабря 2018

Python 3.7 добавляет метод parse_intermixed_args

In [70]: parser = argparse37.ArgumentParser()
In [71]: parser.add_argument('fruit', nargs = '*');
    ...: parser.add_argument('-l', '--ls');

Ваша ошибка - позиционный fruit используется / заполняется первыми двумя строками.Позиционер не может взять последнее.

In [72]: parser.parse_args('apple banana -l list pinaple'.split())
usage: ipython3 [-h] [-l LS] [fruit [fruit ...]]
ipython3: error: unrecognized arguments: pinaple
...

parse_known_args возвращает эти дополнения в другом списке, а не вызывает ошибку:

In [73]: parser.parse_known_args('apple banana -l list pinaple'.split())
Out[73]: (Namespace(fruit=['apple', 'banana'], ls='list'), ['pinaple'])

intermixed может обработатьразделить «позиционный»:

In [74]: parser.parse_intermixed_args('apple banana -l list pinaple'.split())
Out[74]: Namespace(fruit=['apple', 'banana', 'pinaple'], ls='list')
...