Se busca un ejemplo simple de argparse: 1 argumento, 3 resultados

Resuelto matt wilkie asked hace 13 años • 17 respuestas

La documentación para el módulo argparse python , aunque excelente, estoy seguro, es demasiado para que mi pequeño cerebro principiante la comprenda en este momento. No necesito hacer cálculos en la línea de comando ni entrometerme con el formato de las líneas en la pantalla ni cambiar los caracteres de las opciones. Todo lo que quiero hacer es "Si arg es A, haz esto, si B haz aquello, si nada de lo anterior muestra ayuda y sal" .

matt wilkie avatar Sep 15 '11 14:09 matt wilkie
Aceptado

Así es como lo hago argparse(con múltiples argumentos):

parser = argparse.ArgumentParser(description='Description of your program')
parser.add_argument('-f','--foo', help='Description for foo argument', required=True)
parser.add_argument('-b','--bar', help='Description for bar argument', required=True)
args = vars(parser.parse_args())

argsserá un diccionario que contiene los argumentos:

if args['foo'] == 'Hello':
    # code here

if args['bar'] == 'World':
    # code here

En su caso, simplemente agregue solo un argumento.

Diego Navarro avatar Sep 15 '2011 07:09 Diego Navarro

Mi comprensión de la pregunta original es doble. Primero, en términos del ejemplo de argparse más simple posible, me sorprende no haberlo visto aquí. Por supuesto, para ser muy simple, también es todo gastos generales y poca energía, pero podría ayudarte a comenzar.

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("a")
args = parser.parse_args()

if args.a == 'magic.name':
    print 'You nailed it!'

Pero ahora se requiere este argumento posicional. Si lo omite al invocar este programa, obtendrá un error sobre argumentos faltantes. Esto me lleva a la segunda parte de la pregunta original. Matt Wilkie parece querer un único argumento opcional sin una etiqueta con nombre (las etiquetas --option). Mi sugerencia sería modificar el código anterior de la siguiente manera:

...
parser.add_argument("a", nargs='?', default="check_string_for_empty")
...
if args.a == 'check_string_for_empty':
    print 'I can tell that no argument was given and I can deal with that here.'
elif args.a == 'magic.name':
    print 'You nailed it!'
else:
    print args.a

Puede que exista una solución más elegante, pero ésta funciona y es minimalista.

mightypile avatar Feb 26 '2014 15:02 mightypile

La argparsedocumentación es razonablemente buena, pero omite algunos detalles útiles que pueden no ser obvios. (@Diego Navarro ya mencionó algo de esto, pero intentaré ampliar un poco su respuesta). El uso básico es el siguiente:

parser = argparse.ArgumentParser()
parser.add_argument('-f', '--my-foo', default='foobar')
parser.add_argument('-b', '--bar-value', default=3.14)
args = parser.parse_args()

El objeto del que regresa parse_args()es un objeto de 'Espacio de nombres': un objeto cuyas variables miembro reciben el nombre de los argumentos de la línea de comandos. El Namespaceobjeto es cómo accede a sus argumentos y los valores asociados con ellos:

args = parser.parse_args()
print (args.my_foo)
print (args.bar_value)

(Tenga en cuenta que argparsereemplaza '-' en los nombres de sus argumentos con guiones bajos al nombrar las variables).

En muchas situaciones es posible que desee utilizar argumentos simplemente como indicadores que no tienen ningún valor. Puedes agregarlos en argparse de esta manera:

parser.add_argument('--foo', action='store_true')
parser.add_argument('--no-foo', action='store_false')

Lo anterior creará variables denominadas 'foo' con valor Verdadero y 'no_foo' con valor Falso, respectivamente:

if (args.foo):
    print ("foo is true")

if (args.no_foo is False):
    print ("nofoo is false")

Tenga en cuenta también que puede utilizar la opción "obligatoria" al agregar un argumento:

parser.add_argument('-o', '--output', required=True)

De esa manera, si omite este argumento en la línea de comando, argparsele indicará que falta y detendrá la ejecución de su script.

Finalmente, tenga en cuenta que es posible crear una estructura dict de sus argumentos usando la varsfunción, si eso le facilita la vida.

args = parser.parse_args()
argsdict = vars(args)
print (argsdict['my_foo'])
print (argsdict['bar_value'])

Como puede ver, varsdevuelve un dictado con los nombres de sus argumentos como claves y sus valores como, ejem, valores.

Hay muchas otras opciones y cosas que puede hacer, pero esto debería cubrir los escenarios de uso más comunes y esenciales.

DMH avatar Dec 13 '2011 17:12 DMH