이름 (문자열)을 사용하여 모듈의 함수 호출 모듈 foo이 있고 내용이

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

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



답변

foo방법으로 모듈 을 가정 bar:

import foo
method_to_call = getattr(foo, 'bar')
result = method_to_call()

2 행과 3 행을 다음과 같이 단축 할 수 있습니다.

result = getattr(foo, 'bar')()

사용 사례에 더 적합한 경우

getattr이런 방식으로 클래스 인스턴스 바운드 메서드, 모듈 수준 메서드, 클래스 메서드 등을 사용할 수 있습니다 . 목록은 계속됩니다.


답변

locals()["myfunction"]()

또는

globals()["myfunction"]()

locals 는 현재 로컬 심볼 테이블이있는 사전을 반환합니다. globals 는 전역 기호 테이블이있는 사전을 반환합니다.


답변

패트릭의 해결책은 아마도 가장 깨끗할 것입니다. 동적으로 모듈을 선택해야하는 경우 다음과 같이 가져올 수 있습니다.

module = __import__('foo')
func = getattr(module, 'bar')
func()

답변

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

# 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')

답변

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

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]()

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


답변

아무도 원치 않는 대답

행동과 같은 평가

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")()