2014-10-12 5 views
1

Я хочу запустить cli как myscript A B C, который должен возвращать пространство имен (my_attribute = ['A', 'B', 'C']) или myscript, которые должны возвращать значение по умолчанию, если не указаны аргументы т.е. пространство имен (my_attribute = ['A', 'B', 'C', 'D'])Argparse Позиционные аргументы или по умолчанию

Возможно ли это?

  • nargs = '+' требует, по меньшей мере, 1 аргумент командной строки или вызывает ошибку
  • nargs = '?' занимает 1 или 0 арг
  • nargs = «*», кажется, как она должна работать, но не производит список по умолчанию, указанный в add_argument()

У меня есть ниже на данный момент.

parser.add_argument(
    dest='my_attribute', 
    choices=('A', 'B', 'C', 'D'), 
    nargs='*', 
    default=['A', 'B', 'C', 'D'], 
) 

** Редактировать

, например: Это работает, но я должен указать -attr, прежде чем A B. Я не хочу, чтобы использовать -attr

parser.add_argument(
    '-attr', 
    dest='my_attribute', 
    choices=['A','B', 'C', 'D'], 
    nargs='+', 
    default=['A','B', 'C', 'D'], 

ответ

0

Какое сообщение об ошибке вы получаете?

При попытке кода я получаю:

error: argument my_attribute: invalid choice: ['A', 'B', 'C', 'D'] (choose from 'A', 'B', 'C', 'D')

Он пытается использовать по умолчанию, но он испытывает все это против вашего выбора. Вы ожидаете, что он либо не будет проверять значение по умолчанию, либо проверять каждый элемент списка отдельно.

Без choices, * позиционер действительно работает.

Как я уже отмечал в своем первом ответе, позиционирование * требует некоторой специальной обработки. A * опционально нет.

A kludge должен использовать default='A'. Это проходит проверку выбора. Полученное пространство имен будет Namespace(my_attribute='A'). Это не ожидаемый список, но его легко проверить и заменить после разбора.

parser = argparse.ArgumentParser() 
parser.add_argument(
    dest='my_attribute', 
    choices=('A', 'B', 'C', 'D'), 
    nargs='*', 
    default='A', 
) 
args = parser.parse_args() 

if args.my_attribute=='A': 
    args.my_attribute=['A', 'B', 'C', 'D'] 
print args 

Существует отчет об ошибке (несколько лет) по этой теме:

http://bugs.python.org/issue9625 'argparse: Проблема с невыполнением для переменной nargs при использовании вариантов'

Там в предложенном патч выполнил бы «выбор» теста для каждого элемента по умолчанию по умолчанию. При этом argparse должен выполнить ваш пример в порядке. Но есть довольно отставание от argparse патчей, поэтому я не ожидаю увидеть это исправление в ближайшее время.

0

Почему не nargs=4 ? Например.

parser.add_argument(
    dest='my_attribute', 
    choices=list(itertools.permutations(['A', 'B', 'C', 'D'])) 
    nargs=4, 
    default=['A', 'B', 'C', 'D'], 
) 

Примечание Перестановки в choces, как вы, возможно, потребуется следующий выбор:

'A', 'B', 'C', 'D' 
'A', 'D', 'C', 'B' 
... 
'D', 'C', 'B', 'A' 

Заменить permutations с combinations при необходимости.

+0

Разве я не должен указывать здесь 3 аргумента? Я хочу иметь возможность указать от 0 до 4 аргументов, возвращая значение по умолчанию, когда я не укажу какие-либо аргументы. – puffin

+0

Я обновил ответ для четырех аргументов :) –

+0

С помощью этого 'выбора' использование:' usage: PROG [-h] {} {} {} {} '. – hpaulj

Смежные вопросы