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)
sí ... muchas gracias. –
¿Por qué no usar setattr()? – danger89