usage metavar float argumentparser argument python argparse

python - metavar - Compruebe si el argumento opcional argparse está establecido o no



metavar python (6)

Me gustaría verificar si el usuario ha establecido un argumento argparse opcional o no.

¿Puedo verificar con seguridad usando isset?

Algo como esto:

if(isset(args.myArg)): #do something else: #do something else

¿Funciona igual para los argumentos de tipo float / int / string?

Podría establecer un parámetro predeterminado y verificarlo (por ejemplo, establecer myArg = -1, o "" para una cadena, o "NOT_SET"). Sin embargo, el valor que finalmente quiero usar solo se calcula más adelante en el script. Por lo tanto, lo configuraría como -1 por defecto y luego lo actualizaría a otra cosa más tarde. Esto parece un poco torpe en comparación con simplemente verificar si el valor fue establecido por el usuario.


Aquí está mi solución para ver si estoy usando una variable argparse

import argparse ap = argparse.ArgumentParser() ap.add_argument("-1", "--first", required=True) ap.add_argument("-2", "--second", required=True) ap.add_argument("-3", "--third", required=False) # Combine all arguments into a list called args args = vars(ap.parse_args()) if args["third"] is not None: # do something

Esto podría dar más información sobre la respuesta anterior que utilicé y adapté para trabajar para mi programa.


Como señala @Honza, is None es una buena prueba. Es el valor predeterminado default , y el usuario no puede darle una cadena que lo duplique.

Puede especificar otro default=''mydefaultvalue y probarlo. Pero, ¿qué pasa si el usuario especifica esa cadena? ¿Eso cuenta como ajuste o no?

También puede especificar default=argparse.SUPPRESS . Luego, si el usuario no usa el argumento, no aparecerá en el espacio de nombres de args . Pero probar eso podría ser más complicado:

args.foo # raises an AttributeError hasattr(args, ''foo'') # returns False getattr(args, ''foo'', ''other'') # returns ''other''

Internamente, el parser mantiene una lista de seen_actions , y la usa para pruebas ''obligatorias'' y ''mutuamente excluyentes''. Pero no está disponible fuera de parse_args .


Creo que los argumentos opcionales (especificados con -- ) se inicializan en None si no se proporcionan. Por lo tanto, puede probar con is not None . Pruebe el siguiente ejemplo:

import argparse as ap def main(): parser = ap.ArgumentParser(description="My Script") parser.add_argument("--myArg") args, leftovers = parser.parse_known_args() if args.myArg is not None: print "myArg has been set (value is %s)" % args.myArg


Creo que usar la opción default=argparse.SUPPRESS tiene más sentido. Luego, en lugar de verificar si el argumento not None es not None , uno verifica si el argumento está in el espacio de nombres resultante.

Ejemplo:

import argparse argparser = argparse.ArgumentParser() argparser.add_argument(''-flag'', dest=''flag_exists'', action=''store_true'') print argparser.parse_args([]) # Namespace(flag_exists=False) print argparser.parse_args([''-flag'']) # Namespace(flag_exists=True)

Uso:

import argparse parser = argparse.ArgumentParser() parser.add_argument("--foo", default=argparse.SUPPRESS) ns = parser.parse_args() print("Parsed arguments: {}".format(ns)) print("foo in namespace?: {}".format("foo" in ns)) El argumento no se suministra:

$ python argparse_test.py --foo 1 Parsed arguments: Namespace(foo=''1'') foo in namespace?: True


Puede verificar un indicador opcionalmente pasado con las opciones de acción de argumento store_true y store_false :

$ python argparse_test.py Parsed arguments: Namespace() foo in namespace?: False

De esta manera, no tiene que preocuparse de que la verificación condicional is not None . Simplemente verifica si es True o False . Lea más sobre estas opciones en los documentos here


Si su argumento es posicional (es decir, no tiene un prefijo "-" o "-", solo el argumento, generalmente un nombre de archivo), puede usar el parámetro nargs para hacer esto:

parser = argparse.ArgumentParser(description=''Foo is a program that does things'') parser.add_argument(''filename'', nargs=''?'') args = parser.parse_args() if args.filename is not None: print(''The file name is {}''.format(args.filename)) else: print(''Oh well ; No args, no problems'')