2008-11-17 16 views

Respuesta

35

como se indica en la pila pregunta   desbordamiento Inplace substitution from ConfigParser, que está buscando para eval():

print eval('self.post.id') # Prints the value of self.post.id 
+0

sí ... muchas gracias. –

+2

¿Por qué no usar setattr()? – danger89

14

Además, existe la globals() función en Python que devuelve un diccionario con todas las variables definidas. También es posible usar algo como esto:

print globals()["myvar"] 
45

Nota: no uso eval en los casos en que está recibiendo el nombre a mirar hacia arriba desde el usuario introduce entrada. Por ejemplo, si esto proviene de una página web, no hay nada que impida que alguien entre:

__import__("os").system("Some nasty command like rm -rf /*") 

como argumento. Mejor es limitar a ubicaciones de búsqueda bien definidas, como un diccionario o instancia, usando getattr(). Por ejemplo, para encontrar el valor "post" en la asistencia, acceso:

varname = "post" 
value = getattr(self, varname) # Gets self.post 

Al igual que la pusieron, el uso setattr():

value = setattr(self, varname, new_value) 

Manejar fully qualified names, como "post.id", puede usar algo como las funciones a continuación en lugar de getattr()/setattr().

def getattr_qualified(obj, name): 
    for attr in name.split("."): 
     obj = getattr(obj, attr) 
    return obj 

def setattr_qualified(obj, name, value): 
    parts = name.split(".") 
    for attr in parts[:-1]: 
     obj = getattr(obj, attr) 
    setattr(obj, parts[-1], value) 
+2

+1. Definitivamente recomiendo usar getattr() y setattr() – ayaz

14

Se podría hacer algo como lo recomienda Geo, o ir con:

>>> wine = 'pinot_noir' 
>>> vars()[wine] = 'yum' 
>>> pinot_noir 
'yum' 

Nota: vars() y globales() son los mismos, sólo estoy acostumbrado a usar VARs () ¡Me sorprende que nadie me haya llamado así! De todos modos, es vars() y locals() que son lo mismo.