2011-11-29 16 views
7

estoy usando argparse en Python para analizar los argumentos de línea de comandos:Python: El extracto de las variables de espacio de nombres

parser = ArgumentParser() 
parser.add_argument("--a") 
parser.add_argument("--b") 
parser.add_argument("--c") 
args = parser.parse_args() 

Ahora quiero hacer algunos cálculos con a, b, y c. Sin embargo, me resulta tedioso escribir args.a + args.b + args.c todo el tiempo.

Por lo tanto, estoy extrayendo aquellas variables:

a, b, c = [args.a, args.b, args.c] 

tal que puedo escribir a + b + c.

¿Hay una forma más elegante de hacerlo?

La extracción manual es muy tediosa y propensa a errores cuando se agregan muchos argumentos.

Respuesta

8

Si los quieres como globales, que puede hacer:

globals().update(vars(args)) 

Si' re en una función y los quieren como variables locales de esa función, se puede hacer esto en Python 2.x de la siguiente manera:

def foo(args): 
    locals().update(vars(args))  
    print a, b, c 
    return 
    exec "" # forces Python to use a dict for all local vars 
      # does not need to ever be executed! but assigning 
      # to locals() won't work otherwise. 

este truco no funciona en Python 3, donde exec no es una declaración, ni probable en otras variantes de Python como Jython o IronPython.

En general, sin embargo, recomendaría simplemente usar un nombre más corto para el objeto args, o usar su portapapeles. :-)

+0

Gracias por la respuesta. Funciona, pero la parte 'exec '' 'se siente como un hack muy feo. ¿Por qué es eso necesario? – Lemming

+0

Corrección: no funciona si la función contiene funciones anidadas. En este caso, aparece el siguiente mensaje de error: 'exec" " SyntaxError: exec no calificado no está permitido en la función 'main' contiene una función anidada con variables libres ' – Lemming

+0

Ick. No lo sabía, pero tiene sentido. Los cierres requieren el mecanismo variable local estándar de Python, que accede a los locales por índice. El uso de la declaración 'exec' en cualquier parte de una función obliga a Python a usar un método alternativo para acceder a los locales por su nombre, porque' exec' podría definir o modificar locales (esta es la razón por la que puede actualizar 'locals()' if 'exec 'se ve en la función, pero no de otra manera). – kindall

0

Puede agregar cosas al ámbito local llamando al locals(). Devuelve un diccionario que representa el alcance disponible actualmente. Puede asignar valores a él también - locals()['a'] = 12 dará lugar a a estar en el ámbito local con un valor de 12.

+0

No debe modificar el valor de retorno de 'locals()'. No se garantiza que tenga un efecto, y generalmente no lo hace en CPython. http://docs.python.org/library/functions.html#locals –

+0

Parece que esto no funciona sin el truco "exec" "', que kindall mencionó. – Lemming

Cuestiones relacionadas