¿Cuál sería la mejor manera de verificar si se pasó una variable para el script?
try:
sys.argv[1]
except NameError:
startingpoint = 'blah'
else:
startingpoint = sys.argv[1]
¿Cuál sería la mejor manera de verificar si se pasó una variable para el script?
try:
sys.argv[1]
except NameError:
startingpoint = 'blah'
else:
startingpoint = sys.argv[1]
Respuestas:
Al final, la diferencia entre try, excepty probar len(sys.argv)no es tan significativa. Ambos son un poco pirateados en comparación con argparse.
Sin embargo, esto se me ocurre, como una especie de argumentación de bajo presupuesto:
arg_names = ['command', 'x', 'y', 'operation', 'option']
args = dict(zip(arg_names, sys.argv))
Incluso podría usarlo para generar namedtuplevalores con valores predeterminados None, ¡todo en cuatro líneas!
Arg_list = collections.namedtuple('Arg_list', arg_names)
args = Arg_list(*(args.get(arg, None) for arg in arg_names))
En caso de que no esté familiarizado namedtuple, es solo una tupla que actúa como un objeto, lo que le permite acceder a sus valores usando tup.attributesintaxis en lugar de tup[0]sintaxis.
Entonces, la primera línea crea un nuevo namedtupletipo con valores para cada uno de los valores en arg_names. La segunda línea pasa los valores del argsdiccionario, usando getpara devolver un valor predeterminado cuando el nombre del argumento dado no tiene un valor asociado en el diccionario.
Verifique la longitud de sys.argv:
if len(sys.argv) > 1:
blah = sys.argv[1]
else:
blah = 'blah'
Algunas personas prefieren el enfoque basado en excepciones que ha sugerido (p. Ej., try: blah = sys.argv[1]; except IndexError: blah = 'blah'), Pero no me gusta tanto porque no se "escala" tan bien (p. Ej., Cuando desea aceptar dos o tres argumentos) y potencialmente puede ocultar errores (por ejemplo, si usó blah = foo(sys.argv[1]), pero foo(...)generó un IndexError, IndexErrorse ignoraría).
try, except. Espere foosu argumento hasta la elsecláusula.
argparse.
argparse.pyen todos mis proyectos de línea de comandos.
trycláusula ... Entonces, dado que no es más difícil (y, en mi opinión, un poco más bonito), prefiero simplemente verificar la longitud (también, evitas que la gente gritarle por usar excepciones para el control de flujo).
tryapologista, debo admitir. Simplemente siento que a veces expresa mi intención con más claridad que una ifdeclaración.
Otra forma que aún no he visto en la lista es establecer su valor centinela antes de tiempo. Este método aprovecha la evaluación perezosa de Python, en la que no siempre es necesario proporcionar una elsedeclaración. Ejemplo:
startingpoint = 'blah'
if len(sys.argv) >= 2:
startingpoint = sys.argv[1]
O si se está volviendo loco con la sintaxis, puede usar el operador ternario de Python :
startingpoint = sys.argv[1] if len(sys.argv) >= 2 else 'blah'
Yo uso esto, nunca falla:
startingpoint = 'blah'
if sys.argv[1:]:
startingpoint = sys.argv[1]
startingpointvariable del ejemplo, pero la pregunta es asignar una variable alternativa, así que hice lo mismo.
sys.argv[1:]:. Esto funciona con argumentos posicionales mientras que count no lo hace.
Es una lista de Python normal. La excepción que detectaría para esto es IndexError, pero es mejor que solo verifique la longitud.
if len(sys.argv) >= 2:
startingpoint = sys.argv[1]
else:
startingpoint = 'blah'
¡Una solución que funciona con función de mapa incorporada!
arg_names = ['command' ,'operation', 'parameter']
args = map(None, arg_names, sys.argv)
args = {k:v for (k,v) in args}
Entonces solo tienes que llamar a tus parámetros así:
if args['operation'] == "division":
if not args['parameter']:
...
if args['parameter'] == "euclidian":
...
Simplemente puede agregar el valor de argv [1] a argv y luego verificar si argv [1] no es igual a la cadena que ingresó. Ejemplo:
from sys import argv
argv.append('SomeString')
if argv[1]!="SomeString":
print(argv[1])