Python argparse: введите несоответствия при объединении «вариантов», «nargs» и «default»,

У меня есть следующая программа python:

#!/usr/bin/env python import argparse parser = argparse.ArgumentParser() parser.add_argument('arg', choices=['foo', 'bar', 'baz'], default='foo', nargs='*') args = parser.parse_args() print(args) 

Если я вызываю программу следующим образом:

 ./prog.py 

выход

 Namespace(arg='foo') 

Но если я вызываю программу с помощью foo в качестве аргумента:

 ./prog.py foo 

выход

 Namespace(arg=['foo']) 

Вопрос

Как я могу получить значение arg для того, чтобы стать list ?

я пробовал

Я попытался установить default=['foo'] но это приводит к:

 prog.py: error: argument arg: invalid choice: ['foo'] (choose from 'foo', 'bar', 'baz') 

One Solution collect form web for “Python argparse: введите несоответствия при объединении «вариантов», «nargs» и «default»,”

Это дубликат старой, но открытой, ошибки / проблемы

http://bugs.python.org/issue9625 ( argparse: Problem with defaults for variable nargs when using choices )

positional с * получает некоторую специальную обработку. Его значение по умолчанию всегда передается с помощью теста choices если вы не предоставляете значения.

Сравните это с случаем

 In [138]: p=argparse.ArgumentParser() In [139]: a=p.add_argument('--arg',choices=['foo','bar','baz'],nargs='*') In [140]: p.parse_args([]) Out[140]: Namespace(arg=None) In [141]: a.default=['foo'] In [142]: p.parse_args([]) Out[142]: Namespace(arg=['foo']) 

По умолчанию принимается без тестирования:

 In [143]: a.default=['xxx'] In [144]: p.parse_args([]) Out[144]: Namespace(arg=['xxx']) 

Соответствующий код:

 def _get_values(self, action, arg_strings): ... # when nargs='*' on a positional, if there were no command-line # args, use the default if it is anything other than None elif (not arg_strings and action.nargs == ZERO_OR_MORE and not action.option_strings): if action.default is not None: value = action.default else: value = arg_strings self._check_value(action, value) 

Предлагаемый патч / ошибка исправления делает небольшое изменение в этом блоке кода.

  • Как включить один позиционный аргумент в взаимоисключающую группу argparse?
  • Python 2.7 argparse
  • Тестирование модуля Argparse: подавить справочное сообщение
  • Argparse - не улавливайте позиционные аргументы с `nargs`.
  • Argparse python, удалите список подпарантов в меню справки
  • Передача целочисленных списков в python
  • В модуле argparse python, как я могу отключить выбор подкоманды печати между фигурными скобками?
  • Условные аргументы Python Argparse
  • Python - лучший язык программирования в мире.