Подтвердить что ты не робот

Argparse с необходимым подпараметром

Я использую Python 3.4, я пытаюсь использовать argparse с подпараметрами, и я хочу, чтобы аналогичное поведение было в Python 2.x, если я не поставлю позиционный аргумент укажите подпараметр/подпрограмму). Я получу полезное сообщение об ошибке. I.e., с python2 Я получу следующее сообщение об ошибке:

$ python2 subparser_test.py    
usage: subparser_test.py [-h] {foo} ...
subparser_test.py: error: too few arguments

Я устанавливаю атрибут required, как предлагается в qaru.site/info/188413/..., однако это дает мне ошибку с Python 3.4.0: TypeError: sequence item 0: expected str instance, NoneType found - full отслеживающий:

$ python3 subparser_test.py    
Traceback (most recent call last):
  File "subparser_test.py", line 17, in <module>
    args = parser.parse_args()
  File "/usr/local/Cellar/python3/3.4.0/Frameworks/Python.framework/Versions/3.4/lib/python3.4/argparse.py", line 1717, in parse_args
    args, argv = self.parse_known_args(args, namespace)
  File "/usr/local/Cellar/python3/3.4.0/Frameworks/Python.framework/Versions/3.4/lib/python3.4/argparse.py", line 1749, in parse_known_args
    namespace, args = self._parse_known_args(args, namespace)
  File "/usr/local/Cellar/python3/3.4.0/Frameworks/Python.framework/Versions/3.4/lib/python3.4/argparse.py", line 1984, in _parse_known_args
    ', '.join(required_actions))
TypeError: sequence item 0: expected str instance, NoneType found

Это моя программа subparser_test.py - адаптирована из https://docs.python.org/3.2/library/argparse.html#sub-commands:

import argparse

# sub-command functions
def foo(args):
    print('"foo()" called')

# create the top-level parser
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
subparsers.required = True

# create the parser for the "foo" command
parser_foo = subparsers.add_parser('foo')
parser_foo.set_defaults(func=foo)

args = parser.parse_args()
args.func(args)

Связанный вопрос: Почему этот код argparse ведет себя по-разному между Python 2 и 3?

4b9b3361

Ответ 1

Тебе нужно отдать subparsers dest.

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest='cmd')
subparsers.required = True

Сейчас:

1909:~/mypy$ argdev/python3 stack23349349.py
usage: stack23349349.py [-h] {foo} ...
stack23349349.py: error: the following arguments are required: cmd

Чтобы выдать это сообщение об ошибке "отсутствуют аргументы", код должен дать этому аргументу имя. Для позиционного аргумента (например, подпунктов) это имя (по умолчанию) 'dest'. Там (незначительное) примечание об этом в SO ответе вы связали.

Один из немногих "патчей" для argparse в последнем выпуске Python изменил способ проверки "требуемых" аргументов. К сожалению, он представил эту ошибку, касающуюся подпарсеров. Это должно быть исправлено в следующем выпуске (если не раньше).

Обновить

Если вы хотите использовать это необязательное поведение подпарсеров в Py2, лучше всего использовать двухэтапный парсер, как описано в

Как установить подпапку по умолчанию с помощью модуля Argparse с Python 2.7

Там была некоторая недавняя активность в связанной ошибке/проблеме

https://bugs.python.org/issue9253

Обновить

Исправление к этому находится в работе: https://github.com/python/cpython/pull/3027