Преобразовать строку в существующие имена переменных - PullRequest
26 голосов
/ 17 ноября 2008

Как мне преобразовать строку в имя переменной в Python ?

Например, если программа содержит объект с именем self.post, который содержит переменную с именем, я хочу сделать что-то вроде:

somefunction("self.post.id") = |Value of self.post.id|

Ответы [ 4 ]

48 голосов
/ 17 ноября 2008

Примечание: не используйте 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)
39 голосов
/ 17 ноября 2008

Как указано в вопросе переполнения стека Замена на месте из ConfigParser , вы ищете eval():

print eval('self.post.id') # Prints the value of self.post.id
15 голосов
/ 14 ноября 2009

Вы можете сделать что-то вроде того, что рекомендовал Гео, или пойти с:

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

Примечание: vars () и globals () одинаковы, я просто привык использовать vars () Я удивлен, что никто не вызвал меня на это! В любом случае, vars() и locals() одинаковы.

15 голосов
/ 17 ноября 2008

Кроме того, в Python есть функция globals () , которая возвращает словарь со всеми определенными переменными. Вы также можете использовать что-то вроде этого:

print globals()["myvar"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...