MVanPedido
Estoy tratando de usar argparse en una aplicación de Python 3 donde hay una lista explícita de opciones, pero un valor predeterminado si no se especifica ninguna.
El código que tengo es:
parser.add_argument('--list', default="all", choices=['servers', 'storage', 'all'], help='list servers, storage, or both (default: %(default)s)')
args = parser.parse_args()
print(vars(args))
Sin embargo, cuando ejecuto esto, obtengo lo siguiente con una opción:
$ python3 ./myapp.py --list all
{'list': 'all'}
O sin opción:
$ python3 ./myapp.py --list
usage: myapp.py [-h] [--list {servers,storage,all}]
myapp.py: error: argument --list: expected one argument
¿Me estoy perdiendo de algo? ¿O no puedo tener un valor predeterminado con opciones especificadas?
Francisco
Pasa el nargs
y const
argumentos para add_argument
:
parser.add_argument('--list',
default="all",
const="all",
nargs="?",
choices=['servers', 'storage', 'all'],
help='list servers, storage, or both (default: %(default)s)')
Si quieres saber si --list
se aprobó sin argumentos, elimine el const
argumento, y verifique si args.list
es None
.
Documentación:
nargs
con '?'
Si es posible, se consumirá un argumento desde la línea de comando y se producirá como un solo elemento. Si no hay un argumento de línea de comandos presente, el valor de
default
sera producido. Tenga en cuenta que para los argumentos opcionales, hay un caso adicional: la cadena de opción está presente pero no va seguida de un argumento de línea de comandos. En este caso el valor deconst
sera producido.
Cuando
add_argument()
se llama con cadenas de opción (como-f
o--foo
) ynargs="?"
. Esto crea un argumento opcional que puede ir seguido de uno o cero argumentos de la línea de comandos. Al analizar la línea de comando, si la cadena de opción se encuentra sin ningún argumento de línea de comando siguiéndola, el valor deconst
se asumirá en su lugar. Consulte la descripción de nargs para ver ejemplos.
-
Una especie de liendre, pero usaría una tupla en lugar de una lista:
choices=('servers','storage','all')
por las razones discutidas en [stackoverflow.com/questions/1708510/… (Lists vs Tuples)– gerardwAug 23, 2019 at 13:21
Thanks @ShadowRanger. Subcommands
is exactly what I need, combined with nargs
and const
. The following works:
parser = argparse.ArgumentParser()
subparser = parser.add_subparsers()
parser_list = subparser.add_parser('list')
parser_list.add_argument('list_type', default="all", const="all", nargs="?", choices=['all', 'servers', 'storage']) parser_create = subparser.add_parser('create') parser_create.add_argument('create_type', default="servidor", const="servidor", nargs="?", opciones=['server', 'storage']) argumentos = analizador.parse_args() pprint(vars(argumentos)) $ python3 ./myapp.py -h uso: dotool.py [-h] {list,create} ... Argumentos posicionales de la herramienta Digital Ocean: {list,create} argumentos opcionales: -h, --help muestra este mensaje de ayuda y sale
opción de lista sola:
$ python3 ./myapp.py list
{'list_type': 'all'}
Opción de lista con un parámetro:
$ python3 ./myapp.py list servers
{'list_type': 'servers'}
-
¿Podemos agregar una descripción de ayuda para los argumentos posicionales? como para
{list,create}
– alper
8 de febrero a las 14:39
no pases
--list
en absoluto y se utilizará su valor predeterminado.– ShadowRanger
29/10/2016 a las 22:40
Ya veo… Eso funcionaría excepto por el hecho de que necesito decirle que enumere, cree, elimine, etc.
– MVanOrder
29/10/2016 a las 22:43
suena como si quisieras subcomandos, no es un interruptor en absoluto. Incluso con
nargs='?'
no puedes notar la diferencia entre--list
y no pasar nada cuando hay un conjunto predeterminado.– ShadowRanger
29/10/2016 a las 23:04