[PYTHON] 파이썬 함수 포인터
PYTHON파이썬 함수 포인터
함수 이름은 다음과 같은 변수에 저장되어 있습니다.
myvar = 'mypackage.mymodule.myfunction'
이제 저는 이처럼 myfunction을 호출하려고합니다.
myvar(parameter1, parameter2)
이것을 달성하는 가장 쉬운 방법은 무엇입니까?
해결법
-
==============================
1.
funcdict = { 'mypackage.mymodule.myfunction': mypackage.mymodule.myfunction, .... } funcdict[myvar](parameter1, parameter2)
-
==============================
2.파이썬에서 제일 수준의 객체이기 때문에 함수 자체를 저장하는 것이 훨씬 더 좋다.
파이썬에서 제일 수준의 객체이기 때문에 함수 자체를 저장하는 것이 훨씬 더 좋다.
import mypackage myfunc = mypackage.mymodule.myfunction myfunc(parameter1, parameter2)
그러나 패키지를 동적으로 가져와야하는 경우이를 통해 다음을 수행 할 수 있습니다.
mypackage = __import__('mypackage') mymodule = getattr(mypackage, 'mymodule') myfunction = getattr(mymodule, 'myfunction') myfunction(parameter1, parameter2)
그러나이 모든 작업은 현재 사용중인 모든 범위에 적용됩니다. 어떻게 든 유지하지 않으면 로컬 범위를 벗어나면 주변에 머무를 수는 없습니다.
-
==============================
3.
def f(a,b): return a+b xx = 'f' print eval('%s(%s,%s)'%(xx,2,3))
산출
5
-
==============================
4.가장 쉬운
가장 쉬운
eval(myvar)(parameter1, parameter2)
함수 "포인터"가 없습니다. "이름"기능이 있습니다.
이것이 잘 작동하는 동안 많은 사람들이 "안전하지 못함"또는 "보안 위험"이라고 알려줄 것입니다.
-
==============================
5.왜 함수 자체를 저장하지 않습니까? myvar = mypackage.mymodule.myfunction은 훨씬 더 깨끗합니다.
왜 함수 자체를 저장하지 않습니까? myvar = mypackage.mymodule.myfunction은 훨씬 더 깨끗합니다.
-
==============================
6.
modname, funcname = myvar.rsplit('.', 1) getattr(sys.modules[modname], funcname)(parameter1, parameter2)
-
==============================
7.나는 인증을 처리 할 라이브러리를 만드는 동안 유사한 문제에 부딪쳤다. 내 라이브러리를 사용하는 응용 프로그램 소유자가 인증 된 사람이 속한 LDAP 그룹에 대한 승인을 확인하기 위해 라이브러리에 콜백을 등록 할 수있게하려고합니다. 구성이 가져오고 사전을 포함하는 config.py 파일로 전달됩니다. 모든 구성 매개 변수.
나는 인증을 처리 할 라이브러리를 만드는 동안 유사한 문제에 부딪쳤다. 내 라이브러리를 사용하는 응용 프로그램 소유자가 인증 된 사람이 속한 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!
이것을 수행하는 비단뱀 같은 방법이 있습니까?
-
==============================
8.eval (compile (myvar, '
', 'eval')) (myargs) eval (compile (myvar, '
', 'eval')) (myargs) compile (..., 'eval')은 하나의 명령문만을 허용하므로 호출 후에 임의의 명령을 사용할 수 없으며 SyntaxError가 있습니다. 그렇다면 최소한의 유효성 검사만으로도 "mypackage"테스트를 시작하는 것과 같은 식으로 여러분의 힘을 표현할 수 있습니다.
from https://stackoverflow.com/questions/2283210/python-function-pointer by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 날짜 문자열을 다른 형식으로 변환하는 방법 [중복] (0) | 2018.10.11 |
---|---|
[PYTHON] 두 마커 사이에서 부분 문자열을 추출하는 방법은 무엇입니까? (0) | 2018.10.11 |
[PYTHON] 장고 템플릿 내에서 인덱스별로 목록 항목을 참조 하시겠습니까? (0) | 2018.10.11 |
[PYTHON] 수레의 경우 range () (0) | 2018.10.11 |
[PYTHON] 내가 추가 한 각 메소드에 대해 반복해서 타이핑하지 않고 클래스의 모든 기능을 어떻게 장식 할 수 있습니까? 파이썬 [복제] (0) | 2018.10.11 |