如何在python中使用带有全局参数的eval方法

时间:2013-08-15 09:57:18

标签: python lambda eval

我想为lxml节点分配十几个属性。 lambda用于简化输入。注释赋值操作没问题,但使用lambda sa会抛出异常。在这种情况下,anyboy是否知道可以使用lambda? 先谢谢!

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 个答案:

答案 0 :(得分: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)