개발/Python

Python 함수 포인터

MinorMan 2021. 4. 20. 06:34
반응형

<질문>

다음과 같은 변수에 저장된 함수 이름이 있습니다.

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!

이것을 수행하는 비단뱀 같은 방법이 있습니까?

반응형