python argparse opciones con una opción predeterminada

3 minutos de lectura

Avatar de usuario de MVanOrder
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?

  • 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


Avatar de usuario de Francisco
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 de const sera producido.

const

Cuando add_argument() se llama con cadenas de opción (como -f o --foo) y nargs="?". 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 de const 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)

    – gerardw

    Aug 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

¿Ha sido útil esta solución?