Разве плохо использовать vars () - PullRequest
2 голосов
/ 15 июля 2011

У меня есть строковое выражение, на котором мне нужно выполнить eval. Это выражение может иметь имена ключей из данного словаря, а значения для этих ключей могут быть или не быть строками. Чтобы мой eval мог оценить эти имена, я создаю переменные с именами ключей, которые появляются в этом dict, и назначаю ему значение из dict, как в примере ниже. Но из того, что я прочитал здесь , нельзя использовать vars (). Это заставило меня беспокоиться о стабильности, а также о рисках, которые я реализовал. Любые мысли или предложения о том, как это лучше понять?

def test(e1,d1):
 for k,v in d1.iteritems():
     if k in e1:
        vars()[k]=v
 return eval(e1)

test('x+y', {'x':1, 'y':2})

Спасибо !!

Ответы [ 3 ]

2 голосов
/ 15 июля 2011

Существует лучший способ сделать то, что вы пытаетесь сделать: необязательные аргументы globals и locals для eval.

def test(e1, d1):
    return eval(e1, globals(), d1)

делают то же самое, что и ваш код, нобез необходимости гадить с vars.Если вам удастся передать пустой словарь в качестве второго аргумента вместо globals(), это защитит вас от побочных эффектов e1.

2 голосов
/ 15 июля 2011

Почему бы не сделать это:

>>> eval('x+y', {'x':1, 'y':2})
3
1 голос
/ 15 июля 2011

Согласно это , похоже, что вы можете получить тот же эффект, выполнив

def test(e1, d1):
  return eval(e1, locals=d1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...