В функции Eval, если какая-то строковая переменная не является их, как я могу пропустить это - PullRequest
0 голосов
/ 15 марта 2012

У меня есть диктант x={'a':1,'b':2} этого типа.У меня есть еще один диктант, где я хранил формулу

x1={'c':{'p':'pre','r':'ref','2010':'a+b'},'d': {'p':'pre','r':'ref','2010':'f+g'}

Я использую eval для вычисления формулы.Для этого я использую код

for k,v in x1.iteritems():
   if eval(x1[k]['2010'],x) is False:
       continue

На самом деле значение для "a" и "b" это их, но значения "f" и "g" не их eval(x1['c']['2010'],x) работает, но eval(x1['d]['2010'],x) не работает, поэтомуЯ хочу пропустить эту оценку.Но это показывает, что 'f' не определено.

Ответы [ 3 ]

1 голос
/ 15 марта 2012

Зачем использовать eval()? Почему бы просто не проверить ценность? Кроме того, поскольку вы используете .items(), вы получаете ключ и значение, поэтому вам не нужно повторно ссылаться на словарь.

for k, v in x.items():
    if not v:
        continue
0 голосов
/ 15 марта 2012

Есть понятие, которое вам не хватает: лямбда-выражения. Они позволяют создавать функции с одним выражением.

Итак, вместо eval('a+b', {'a':1,'b':2}) вы можете сделать (lambda a,b: a+b)(1,2). Лямбда-выражения (например, функции) являются первоклассными объектами, которые можно хранить в диктанте.

0 голосов
/ 15 марта 2012

Возможно, вы захотите попробовать:

for k,v in x1.iteritems():
    try:
        eval(x1[k]['2010'],x)
    except NameError:
       continue

Но ИМХО концепция несколько странная - или я просто не понимаю ...

Кстати: закрывающая скобка отсутствует в определении x1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...