Как преобразовать строку в имя переменной в Python?
Например, если программа содержит объект с именем self.post
, который содержит указанную переменную, я хочу сделать что-то вроде:
somefunction("self.post.id") = |Value of self.post.id|
Как преобразовать строку в имя переменной в Python?
Например, если программа содержит объект с именем self.post
, который содержит указанную переменную, я хочу сделать что-то вроде:
somefunction("self.post.id") = |Value of self.post.id|
Как указано в вопросе "Переполнение" Замена подстановки из ConfigParser, вы ищете eval()
:
print eval('self.post.id') # Prints the value of self.post.id
Примечание: используйте не использование 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)
Кроме того, существует globals() в Python, который возвращает словарь со всеми определенными переменными. Вы также можете использовать что-то вроде этого:
print globals()["myvar"]
Вы можете сделать что-то вроде того, что рекомендовал Geo, или пойти с:
>>> wine = 'pinot_noir'
>>> vars()[wine] = 'yum'
>>> pinot_noir
'yum'
Примечание: vars() и globals() одинаковы, я просто использую vars()
Я удивлен, что меня никто не вызвал! Во всяком случае, это те же vars()
и locals()
.