2013-08-15 2 views
1

Я хочу назначить дюжину свойств узлу lxml. Лямбда используется для упрощения ввода текста. Операции присваивания комментариев в порядке, но использование lambda sa сделает исключение. Знает ли кто-нибудь, возможно ли использовать лямбда в этом случае? Спасибо, продвинутый!Как использовать метод eval с глобальными параметрами в python

sa = set_attr = lambda n, v: eval("etp.xpath(u'/Recipe_Definition/%s')[0].text = u'%s'" % (n, v), {u'etp':etp}) 
#etp.xpath(u'/Recipe_Definition/Author')[0].text = rc.author 
#etp.xpath(u'/Recipe_Definition/Comment')[0].text = rc.comment 
sa(u'Author', rc.author) 
sa(u'Comment', rc.comment) 

Исключение составит:

sa = set_attr = lambda n, v: eval("etp.xpath(u'/Recipe_Definition/%s')[0].text = u'%s'" % (n, v), {u'etp':etp}) 
File "<string>", line 1 
    etp.xpath(u'/Recipe_Definition/Author')[0].text = u'admin' 
+1

Почему 'Eval()' ** на всех ** здесь? Это не нужно. –

+0

Просто хотите уменьшить коды ввода. Это немного переполнено. :) – Erxin

+0

unicode (v) не работает. – Erxin

ответ

0

Вы делаете не необходимость использования eval() здесь. Вообще. Не используйте eval() для интерполяции строковых значений в другие строковые значения. Более того, назначение в lambda недопустимо (назначение - это инструкция, а lambda поддерживает только выражения).

Следующая lambda делает то же самое:

lambda n, v: setattr(etp.xpath(u'/Recipe_Definition/' + n)[0], 'text', v) 

и использует etp как глобальный. Вы можете также передать в etp в качестве аргумента, если etp не является глобальным модуля вы определили lambda в:

lambda etp, n, v: setattr(etp.xpath(u'/Recipe_Definition/' + n)[0], 'text', v) 
+0

etp не является глобальной переменной, она определяется локальным методом. Причина, по которой она добавляется как параметр eval, я думаю, может быть, метод eval не может поймать узел lxml – Erxin

+0

"lambda etp, n, v: etp.xpath (u '/ Recipe_Definition /' + n) [0]. text = v "Этот синтаксис неверен. Компилятор будет вызывать ошибку о том, что вы не можете присвоить значение лямбда-выражению – Erxin

+0

Вот почему я пытаюсь использовать eval, передавая этот случай. – Erxin

Смежные вопросы