<질문>
다음과 같은 변수에 저장된 함수 이름이 있습니다.
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
훨씬 깨끗합니다.
<답변6>
modname, funcname = myvar.rsplit('.', 1)
getattr(sys.modules[modname], funcname)(parameter1, parameter2)
<답변7>
eval(compile(myvar,'<str>','eval'))(myargs)
compile (..., 'eval')은 단일 문만 허용하므로 호출 후에 임의의 명령이있을 수 없거나 SyntaxError가 발생합니다. 그런 다음 약간의 유효성 검사를 통해 최소한 'mypackage'를 시작하기위한 테스트와 같이 표현식을 힘의 무언가로 제한 할 수 있습니다.
<답변8>
인증을 처리하기 위해 라이브러리를 만드는 동안 비슷한 문제가 발생했습니다. 내 라이브러리를 사용하는 앱 소유자가 인증 된 사용자가 속한 LDAP 그룹에 대한 인증을 확인하기 위해 라이브러리에 콜백을 등록 할 수 있기를 원합니다. 구성은 가져오고 다음과 같은 dict를 포함하는 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!
이것을 수행하는 비단뱀 같은 방법이 있습니까?
'개발 > Python' 카테고리의 다른 글
파이썬 문자열이 변경 불가능한 이유는 무엇입니까? (0) | 2021.04.21 |
---|---|
Python에서 소수점 세 자리로 자르기 (0) | 2021.04.20 |
[파이썬] crontab에 대해 virtualenv를 설정하는 방법은 무엇입니까? (0) | 2021.04.20 |
[파이썬] Pydoc으로 문서를 어떻게 만드나요? (0) | 2021.04.20 |