Se busca un ejemplo simple de argparse: 1 argumento, 3 resultados
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" .
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())
args
será 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.
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.
La argparse
documentació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 Namespace
objeto 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 argparse
reemplaza '-' 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, argparse
le 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 vars
funció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, vars
devuelve 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.