이 같은 변수에 저장하는 기능 이름이 있습니다파이썬 함수 포인터
myvar = 'mypackage.mymodule.myfunction'
을 내가 지금이
myvar(parameter1, parameter2)
이를 달성하는 가장 쉬운 방법은 무엇입니까 같은 myFunction이 전화를 걸?
이 같은 변수에 저장하는 기능 이름이 있습니다파이썬 함수 포인터
myvar = 'mypackage.mymodule.myfunction'
을 내가 지금이
myvar(parameter1, parameter2)
이를 달성하는 가장 쉬운 방법은 무엇입니까 같은 myFunction이 전화를 걸?
가장 쉬운
eval(myvar)(parameter1, parameter2)
당신은 함수 "포인터"를 필요가 없습니다. "이름"기능이 있습니다.
이 방법이 효과적 일지는 모르겠지만 "안전하지 못함"또는 "보안 위험"이라고 많은 사람들이 알게됩니다.
def f(a,b):
return a+b
xx = 'f'
print eval('%s(%s,%s)'%(xx,2,3))
OUTPUT
5
나는 downvote를 상쇄하기 위해 upvote를 줄 것이다. 그것은 최선의 해결책이 아닐 수도 있습니다. 나는 그것이 완전한 예제를 보여주기 때문에 도움이되는 대답이라고 생각합니다. –
@ Bryan Oakley 환호! –
eval은 악마, imo – zanlok
modname, funcname = myvar.rsplit('.', 1)
getattr(sys.modules[modname], funcname)(parameter1, parameter2)
왜 함수 자체를 저장하지? myvar = mypackage.mymodule.myfunction
은 훨씬 깨끗합니다.
함수 자체를 저장할 수있는 것이 훨씬 더 좋습니다. 함수가 파이썬의 최상급 객체이기 때문에 훨씬 더 좋을 것입니다.
import mypackage
myfunc = mypackage.mymodule.myfunction
myfunc(parameter1, parameter2)
그러나, 동적 패키지를 가져올 경우, 당신은이를 통해 달성 할 수있다 : 그 모든 작업이 현재있어 어떤 범위에 적용, 그러나 염두에
mypackage = __import__('mypackage')
mymodule = getattr(mypackage, 'mymodule')
myfunction = getattr(mymodule, 'myfunction')
myfunction(parameter1, parameter2)
곰 당신이 그들을 어떻게 든 지키지 않으면, 당신이 그 지역의 영역을 떠나면 그들 주위에 머무를 수는 없습니다. 전화 후 임의의 명령이있을 수 없습니다, 또는 구문 에러가 될 수 있도록
eval(compile(myvar,'<str>','eval'))(myargs)
컴파일 (..., '평가')는, 단 하나의 문을 수 있습니다. 그렇다면 최소한의 유효성 검사만으로도 "mypackage"테스트를 시작하는 것과 같은 식으로 여러분의 힘을 표현할 수 있습니다.
인증을 처리 할 라이브러리를 만드는 동안 비슷한 문제가 발생했습니다. 내 라이브러리를 사용하는 응용 프로그램 소유자가 인증 된 사람이 속한 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!
있습니까 :
나는이 일있어?
왜 함수 자체를 저장하지 않습니까? 'myvar = mypackage.mymodule.myfunction'은 훨씬 더 깨끗합니다. – ironfroggy
아래의 주석에서«일반적인 응용 프로그램이기 때문에 응용 프로그램이 정의 된 위치에서 응용 프로그램이 원하는 기능을 알지 못하므로 문자열이어야합니다.»- schneck – badp