我想为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'
答案 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)