복붙노트

[PYTHON] 파이썬 함수 포인터

PYTHON

파이썬 함수 포인터

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

myvar = 'mypackage.mymodule.myfunction'

이제 저는 이처럼 myfunction을 호출하려고합니다.

myvar(parameter1, parameter2)

이것을 달성하는 가장 쉬운 방법은 무엇입니까?

해결법

  1. ==============================

    1.

    funcdict = {
      'mypackage.mymodule.myfunction': mypackage.mymodule.myfunction,
        ....
    }
    
    funcdict[myvar](parameter1, parameter2)
    
  2. ==============================

    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. ==============================

    3.

    def f(a,b):
        return a+b
    
    xx = 'f'
    print eval('%s(%s,%s)'%(xx,2,3))
    

    산출

     5
    
  4. ==============================

    4.가장 쉬운

    가장 쉬운

    eval(myvar)(parameter1, parameter2)
    

    함수 "포인터"가 없습니다. "이름"기능이 있습니다.

    이것이 잘 작동하는 동안 많은 사람들이 "안전하지 못함"또는 "보안 위험"이라고 알려줄 것입니다.

  5. ==============================

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

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

  6. ==============================

    6.

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

    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. ==============================

    8.eval (compile (myvar, '', 'eval')) (myargs)

    eval (compile (myvar, '', 'eval')) (myargs)

    compile (..., 'eval')은 하나의 명령문만을 허용하므로 호출 후에 임의의 명령을 사용할 수 없으며 SyntaxError가 있습니다. 그렇다면 최소한의 유효성 검사만으로도 "mypackage"테스트를 시작하는 것과 같은 식으로 여러분의 힘을 표현할 수 있습니다.

  9. from https://stackoverflow.com/questions/2283210/python-function-pointer by cc-by-sa and MIT license