python - 이름으로 - 파이썬 함수 호출




이름(문자열)을 사용하여 모듈의 함수 호출 (8)

파이썬 프로그램에서 함수 이름을 가진 문자열이 주어진 함수를 호출하는 가장 좋은 방법은 무엇입니까? 예를 들어, 모듈 foo 가 있고 내용이 "bar" 인 문자열이 있다고 가정 해 봅시다. foo.bar() 를 호출하는 가장 좋은 방법은 무엇입니까?

함수의 반환 값을 eval 하므로 eval 만 사용하지 않는 이유입니다. eval 을 사용하여 해당 함수 호출의 결과를 반환하는 임시 함수를 정의하여이를 수행하는 방법을 알아 냈지만 더 우아한 방법이 있기를 바랍니다.


가치있는 것을 위해 함수 (또는 클래스) 이름과 앱 이름을 문자열로 전달 해야하는 경우 다음을 수행 할 수 있습니다.

myFnName  = "MyFn"
myAppName = "MyApp"
app = sys.modules[myAppName]
fn  = getattr(app,myFnName)

간단한 기여. 인스턴스화해야 할 클래스가 동일한 파일에 있으면 다음과 같이 사용할 수 있습니다.

# Get class from globals and create an instance
m = globals()['our_class']()

# Get the function (from the instance) that we need to call
func = getattr(m, 'function_name')

# Call it
func()

예를 들면 다음과 같습니다.

class A:
    def __init__(self):
        pass

    def sampleFunc(self, arg):
        print('you called sampleFunc({})'.format(arg))

m = globals()['A']()
func = getattr(m, 'sampleFunc')
func('sample arg')

# Sample, all on one line
getattr(globals()['A'](), 'sampleFunc')('sample arg')

그리고 수업이 아닌 경우 :

def sampleFunc(arg):
    print('you called sampleFunc({})'.format(arg))

globals()['sampleFunc']('sample arg')

아무도 원치 않는 대답

행동과 같은 평가

getattr(locals().get("foo") or globals().get("foo"), "bar")()

자동 가져 오기를 추가하지 않는 이유

getattr(
    locals().get("foo") or 
    globals().get("foo") or
    __import__("foo"), 
"bar")()

추가 사전이있는 경우 확인하고 싶습니다.

getattr(next((x for x in (f("foo") for f in 
                          [locals().get, globals().get, 
                           self.__dict__.get, __import__]) 
              if x)),
"bar")()

우리는 더 깊이 가야한다

getattr(next((x for x in (f("foo") for f in 
              ([locals().get, globals().get, self.__dict__.get] +
               [d.get for d in (list(dd.values()) for dd in 
                                [locals(),globals(),self.__dict__]
                                if isinstance(dd,dict))
                if isinstance(d,dict)] + 
               [__import__])) 
        if x)),
"bar")()

이 시도. 이것은 여전히 ​​eval을 사용하지만 현재 컨텍스트에서 함수소환하는 데만 사용합니다. 그런 다음 원하는대로 사용할 실제 기능이 있습니다.

이 기능의 주요 이점은 함수를 소환 할 때 평가 관련 오류가 발생한다는 것입니다. 그러면 호출 할 때 함수 관련 오류 만 표시됩니다.

def say_hello(name):
    print 'Hello {}!'.format(name)

# get the function by name
method_name = 'say_hello'
method = eval(method_name)

# call it like a regular function later
args = ['friend']
kwargs = {}
method(*args, **kwargs)

이것은 간단한 대답입니다. 예를 들어 화면을 지울 수 있습니다. 아래에는 eval 및 exec의 두 가지 예가 있으며, 청소 후 맨 위에 0을 인쇄하거나 (Windows를 사용하는 경우 cls clear 면 Linux 및 Mac 사용자는 그대로 둡니다) Linux 또는 Mac 사용자는 각각 실행합니다.

eval("os.system(\"clear\")")
exec("os.system(\"clear\")")

제안 된 것 중 어느 것도 나를 도우 지 못했습니다. 나는 이것을 발견했다.

<object>.__getattribute__(<string name>)(<params>)

파이썬 2.66을 사용하고 있습니다

이것이 도움이되기를 바랍니다.


함수에 대한 완전한 파이썬 경로가있는 문자열이 주어지면이 함수의 결과를 얻는 방법입니다.

import importlib
function_string = 'mypackage.mymodule.myfunc'
mod_name, func_name = function_string.rsplit('.',1)
mod = importlib.import_module(mod_name)
func = getattr(mod, func_name)
result = func()

Python 프로그래밍 FAQ 에 따르면 가장 좋은 대답은 다음과 같습니다.

functions = {'myfoo': foo.bar}

mystring = 'myfoo'
if mystring in functions:
    functions[mystring]()

이 기술의 주요 장점은 문자열이 함수 이름과 일치 할 필요가 없다는 것입니다. 이것은 또한 사례 구조를 에뮬레이트하는 데 사용되는 기본 기술입니다





object