python argparse python-3.4

python - Argparse con el subparser requerido



python-3.4 (1)

Necesitas darles a los subparsers un subparsers .

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

Ahora:

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

Para emitir este mensaje de error de ''faltantes argumentos'', el código necesita dar un nombre a ese argumento. Para un argumento posicional (como subparses), ese nombre es (por defecto) el ''dest''. Hay una nota (menor) sobre esto en la respuesta SO que enlazó.

Uno de los pocos ''parches'' de argparse en el último lanzamiento de Python cambió la manera en que prueba los argumentos ''requeridos''. Desafortunadamente, introdujo este error con respecto a los subparsers. Esto debe corregirse en la próxima versión (si no antes).

actualizar

Si desea este comportamiento de subparsers opcional en Py2, parece que la mejor opción es usar un analizador de dos etapas como se describe en

Cómo establecer un subparser predeterminado usando Argparse Module con Python 2.7

Ha habido alguna actividad reciente en el error / problema relacionado

https://bugs.python.org/issue9253

actualizar

Una solución a esto está en proceso: https://github.com/python/cpython/pull/3027

Estoy usando Python 3.4, estoy tratando de usar argparse con subparsers, y quiero tener un comportamiento similar al de Python 2.x donde si no proporciono un argumento posicional (para indicar el subpagrama / subprograma ) Recibiré un mensaje de error útil. Es decir, con python2 obtendré el siguiente mensaje de error:

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

Estoy configurando el atributo required como se sugiere en https://stackoverflow.com/a/22994500/3061818 , sin embargo, eso me da un error con Python 3.4.0: TypeError: sequence item 0: expected str instance, NoneType found - full rastrear:

$ 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

Este es mi programa subparser_test.py - adaptado de 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)

Pregunta relacionada: ¿Por qué este código argparse se comporta de manera diferente entre Python 2 y 3?