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'')