2012-07-10 1 views
2

환경 (핵 프로그램이라는 그래픽 프로그램)에서 메뉴 항목을 추가하고 함수와 연결할 수있는 전역 개체가 제공됩니다. 이 전역 객체는 다음과 같이 작동합니다 :getattr()과 결합하여 동적으로 파이썬 모듈을 lambda :로 파이썬에서로드하는 방법?

menu.addCommand("Do This!", lambda: DoThings()) 

나는 동적으로 파이썬 모듈을 읽고 글로벌 메뉴 객체의 항목으로 모듈 함수를 추가하고 싶습니다. 나는 그것을하기 위해 수업을 썼다. 수업의 간략화 된 버전 :

class mymenu(): 
. 
. 
. 
def _builMenuFromPath(self, basepath, module): 

    items = [] 

    # ... 
    # there is code to build the items list. this is a list of the python filenames 
    # ... 

    if len(items) > 0: 

     for item in items: 

      try: 
       f = getattr(__import__(module + "." + item), item) # item is the python filename of an module in the folder with the python files and module is the folder 

       menu.addCommand(item, lambda: f.call()) # f.call() is a function in the dynamic loaded python file 

      except Exception, e: 
       pass 

동적 가져 오기가 매우 효과적입니다. 그러나 생성 된 모든 메뉴 항목은 마지막으로 가져온 기능과 연결됩니다. 그래서 모든 menuitems는 똑같이합니다.

저는 전문 프로그래머가 아닙니다. 그래서 나는 단순한 실수를한다고 생각합니다.

도움 주셔서 감사합니다.

답변

0

lambda : f.call() 대신 f.call을 전달해보십시오.

+0

감사합니다. 그 작품! 나는 반나절을 잃는다. – Jonas

+0

@Jonas이 답변에 제공된 설명을 살펴보십시오. – Marcin

+0

@Jonas 언제든지. 질문에 대답 한 답변을 "대답 함"(해당 옆에있는 체크 표시)으로 표시하십시오. 그러면 귀하의 질문이 답변으로 표시됩니다. – Lanaru

0

표현식 lambda: f.call()에서 f은 둘러싼 범위의 변수 f을 참조하는 자유 용어입니다. 즉, f 값의 변화가 람다 내부에서 명백하게 나타납니다. 예를 들어 파이썬 함수 및 방법 (람다와 같은) 임의의 호출이 전달 될 수있는 목적지 자체가 전달 될 수있는 개체 때문에

>>> n = 1 
>>> lambda: n 
<function <lambda> at 0x00000000027F0898> 
>>> l = lambda: n 
>>> l() 
1 
>>> n = 2 
>>> l() 
2 

그러나 lambda 불필요하다. 이 코드에서 :

menu.addCommand(item, f.call) 

f.call는 호출하는 바인딩 방법으로 평가합니다 표현이다.

+0

감사합니다. 나는 이제 람다 (lambda)가 얼마나 정확하게 작동하는지 이해한다. 제 방식으로는 일할 수 없었습니다. – Jonas

+0

@Jonas 문제 없습니다. 그것은 많은 사람들이 그립에 도달 할 시간이 필요한 것입니다. 계속해서 투표하고 동의하십시오. – Marcin

관련 문제