2013-08-15 4 views
1

lxml 노드에 12 개의 속성을 할당하려고합니다. 람다는 타이핑을 단순화하는 데 사용됩니다. 주석 할당 작업은 정상이지만 람다 sa를 사용하면 예외가 발생합니다. anyboy가이 경우 람다를 사용할 수 있다는 것을 알고 있습니까? 고맙습니다!python에서 전역 매개 변수와 함께 eval 메서드를 사용하는 방법

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

왜'평가()를 사용하여 여기 **'** 전혀 : etp 당신의 lambda 정의 된 모듈의 세계가 아닌 경우 당신은 또한 인수로 etp에 전달할 수 있습니다? 필요하지 않습니다. –

+0

타이핑 코드를 줄이고 싶습니다. 조금 지나치다. :) – Erxin

+0

유니 코드 (v)가 작동하지 않습니다. – Erxin

답변

0

현재 eval()를 사용하는 하지 필요성을한다. 조금도. eval()을 사용하여 문자열 값을 다른 문자열 값으로 보간하지 마십시오. 또한 lambda의 할당은 허용되지 않습니다. 할당은 명령문이며 lambda은 표현식 만 지원합니다.

다음 lambda같은 일 수행합니다

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

와 글로벌로 etp을 사용합니다.

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]을 catch 할 수 없다는 것입니다. text = v "이 구문은 잘못되었습니다. 컴파일러에서 람다 식에 값을 할당 할 수 없다는 오류가 발생합니다 – Erxin

+0

이것이이 경우를 통과하여 eval을 사용하려고하는 이유입니다. – Erxin

관련 문제