Примечание: не используйте eval в любом случае, когда вы получаете имя для поиска из введенного пользователем ввода. Например, если это происходит с веб-страницы, ничто не мешает кому-либо войти:
__import__("os").system("Some nasty command like rm -rf /*")
в качестве аргумента. Лучше ограничить четко определенные местоположения поиска, такие как словарь или экземпляр, используя getattr () . Например, чтобы найти значение «post» для себя, используйте:
varname = "post"
value = getattr(self, varname) # Gets self.post
Аналогично, чтобы установить его, используйте setattr ():
value = setattr(self, varname, new_value)
Для обработки полностью определенных имен , таких как "post.id", вы можете использовать что-то вроде следующих функций вместо 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)