카테고리 보관물: Python

Python

이름 (문자열)을 사용하여 모듈의 함수 호출 모듈 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")()