2010-02-17 3 views
54

이 같은 변수에 저장하는 기능 이름이 있습니다파이썬 함수 포인터

myvar = 'mypackage.mymodule.myfunction' 

을 내가 지금이

myvar(parameter1, parameter2) 

이를 달성하는 가장 쉬운 방법은 무엇입니까 같은 myFunction이 전화를 걸?

+4

왜 함수 자체를 저장하지 않습니까? 'myvar = mypackage.mymodule.myfunction'은 훨씬 더 깨끗합니다. – ironfroggy

+1

아래의 주석에서«일반적인 응용 프로그램이기 때문에 응용 프로그램이 정의 된 위치에서 응용 프로그램이 원하는 기능을 알지 못하므로 문자열이어야합니다.»- schneck – badp

답변

81
funcdict = { 
    'mypackage.mymodule.myfunction': mypackage.mymodule.myfunction, 
    .... 
} 

funcdict[myvar](parameter1, parameter2) 
+1

+1 좋은 답변입니다. –

+0

마지막으로 솔루션이 내 요구 사항에 가장 잘 맞습니다. 감사합니다. – schneck

+0

함수가 여러 번 (루프, 재귀, 기타 등등) 호출 될 경우 어떤 성능 저하가 발생했는지 궁금합니다. – zanlok

7

가장 쉬운

eval(myvar)(parameter1, parameter2) 

당신은 함수 "포인터"를 필요가 없습니다. "이름"기능이 있습니다.

이 방법이 효과적 일지는 모르겠지만 "안전하지 못함"또는 "보안 위험"이라고 많은 사람들이 알게됩니다.

+1

"insecure": myvar가 사용자 입력에서 오는 경우 , 예 :) –

+20

그들은 "옳은"것입니다. –

+6

...그 많은 사람들이 옳습니다. – Triptych

13
def f(a,b): 
    return a+b 

xx = 'f' 
print eval('%s(%s,%s)'%(xx,2,3)) 

OUTPUT

5 
+0

나는 downvote를 상쇄하기 위해 upvote를 줄 것이다. 그것은 최선의 해결책이 아닐 수도 있습니다. 나는 그것이 완전한 예제를 보여주기 때문에 도움이되는 대답이라고 생각합니다. –

+0

@ Bryan Oakley 환호! –

+4

eval은 악마, imo – zanlok

4
modname, funcname = myvar.rsplit('.', 1) 
getattr(sys.modules[modname], funcname)(parameter1, parameter2) 
5

왜 함수 자체를 저장하지? myvar = mypackage.mymodule.myfunction은 훨씬 깨끗합니다.

33

함수 자체를 저장할 수있는 것이 훨씬 더 좋습니다. 함수가 파이썬의 최상급 객체이기 때문에 훨씬 더 좋을 것입니다.

import mypackage 

myfunc = mypackage.mymodule.myfunction 
myfunc(parameter1, parameter2) 

그러나, 동적 패키지를 가져올 경우, 당신은이를 통해 달성 할 수있다 : 그 모든 작업이 현재있어 어떤 범위에 적용, 그러나 염두에

mypackage = __import__('mypackage') 
mymodule = getattr(mypackage, 'mymodule') 
myfunction = getattr(mymodule, 'myfunction') 

myfunction(parameter1, parameter2) 

곰 당신이 그들을 어떻게 든 지키지 않으면, 당신이 그 지역의 영역을 떠나면 그들 주위에 머무를 수는 없습니다. 전화 후 임의의 명령이있을 수 없습니다, 또는 구문 에러가 될 수 있도록

1

eval(compile(myvar,'<str>','eval'))(myargs)

컴파일 (..., '평가')는, 단 하나의 문을 수 있습니다. 그렇다면 최소한의 유효성 검사만으로도 "mypackage"테스트를 시작하는 것과 같은 식으로 여러분의 힘을 표현할 수 있습니다.

1

인증을 처리 할 라이브러리를 만드는 동안 비슷한 문제가 발생했습니다. 내 라이브러리를 사용하는 응용 프로그램 소유자가 인증 된 사람이 속한 LDAP 그룹에 대한 승인을 확인하기 위해 라이브러리에 콜백을 등록 할 수있게하려고합니다. 구성이 가져오고 사전을 포함하는 config.py 파일로 전달됩니다. 모든 구성 매개 변수. 이 작업을 수행 할 수있는 파이썬 - 어 방법이

>>> class MyClass(object): 
...  def target_func(self): 
...   print "made it!" 
...  
...  def __init__(self,config): 
...   self.config = config 
...   self.config['funcname'] = getattr(self,self.config['funcname']) 
...   self.config['funcname']() 
... 
>>> instance = MyClass({'funcname':'target_func'}) 
made it! 

있습니까 :

나는이 일있어?