Me gustaría comprobar si el usuario ha establecido un argumento opcional argparse o no.
¿Puedo verificar de forma segura 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 en última instancia quiero usar solo se calcula más adelante en el script. Entonces lo establecería en -1 como predeterminado y luego lo actualizaría a otra cosa más adelante. Esto parece un poco torpe en comparación con simplemente verificar si el valor fue establecido por el usuario.
isset()
(pista: Python no es PHP)? ¿Querías decir enhasattr()
cambio, quizás? ¿Por qué no configurar argparse para establecer un valor predeterminado para una opción en su lugar?Respuestas:
Creo que los argumentos opcionales (especificados con
--
) se inicializanNone
si no se proporcionan. Entonces puedes probar conis not None
. Pruebe el siguiente ejemplo:fuente
default
valor definido.default
, aún puede establecernargs='?'
y proporcionar unconst
valor, como se describe en los documentos . Cuando arg está ausente,default
se usa, cuando arg se da sin valor, entoncesconst
se usa, de lo contrario se usa el valor dado. Con solodefault
ynargs='?'
,default
se usa si no se da,None
si se da sin valor, de lo contrario el valor dado.action= "store_true"
oaction="store_const", const="yourconst"
no puede usar ese argumento para almacenar otro valor. Esto no funcionará si se utilizan valores predeterminados. En el mío, eliminé todos los valores predeterminados de argparser y manejé todo dentro de otra funcióndef defaults():
en la que combino ConfigParser, ArgumentParser y los valores predeterminados en el orden que quieroaction
. La respuesta no usa unaction
. Las acciones que menciona están documentadas para comportarse de una manera específica (como observó). Sin embargo, no es necesario definir una acción.Como señala @Honza,
is None
es una buena prueba. Es el valor predeterminadodefault
y el usuario no puede darle una cadena que lo duplique.Puede especificar otro
default='mydefaultvalue
y probarlo. Pero, ¿y si el usuario especifica esa cadena? ¿Eso cuenta como escenario o no?También puede especificar
default=argparse.SUPPRESS
. Entonces, si el usuario no usa el argumento, no aparecerá en elargs
espacio de nombres. Pero probar eso podría ser más complicado:Internamente,
parser
mantiene una listaseen_actions
y la usa para pruebas 'requeridas' y 'mutuamente_exclusivas'. Pero no está disponible para ti fuera deparse_args
.fuente
Creo que usar la opción
default=argparse.SUPPRESS
tiene más sentido. Entonces, en lugar de comprobar si el argumento esnot None
, se comprueba si el argumento esin
el espacio de nombres resultante.Ejemplo:
Uso:
No se proporciona el argumento:fuente
testfoo.py: error: argument --foo: expected one argument
--foo
sin un valor (es decir,1
en mi ejemplo), debe especificarlonargs=0
en laadd_argument
función.action='store_true'
respuesta a continuación en su lugar en mi código real.python argparse_test.py --foo 1
?Puede comprobar una bandera opcionalmente con pasado
store_true
ystore_false
opciones de acción argumento:De esta manera, no tiene que preocuparse por verificar por condicional
is not None
. Simplemente buscaTrue
oFalse
. Lea más sobre estas opciones en los documentos aquí.fuente
Si su argumento es posicional (es decir, no tiene un prefijo "-" o "-", solo el argumento, generalmente un nombre de archivo), entonces puede usar el parámetro nargs para hacer esto:
fuente
Aquí está mi solución para ver si estoy usando una variable argparse
Esto podría dar más información sobre la respuesta anterior que utilicé y adapté para trabajar en mi programa.
fuente
Para abordar el comentario de @ kcpr sobre la respuesta (actualmente aceptada) de @Honza Osobne
primero se puede verificar si el argumento se proporcionó comparándolo con el
Namespace
objeto y proporcionando ladefault=argparse.SUPPRESS
opción (consulte las respuestas de @ hpaulj y @Erasmus Cedernaes y este documento de python3 ) y si no se ha proporcionado, configúrelo en un valor predeterminado.Uso
fuente
Muy simple, después de definir la variable args por 'args = parser.parse_args ()', también contiene todos los datos de las variables del subconjunto args. Para verificar si una variable está establecida o no, asumiendo que se usa 'action = "store_true" ...
fuente