문제

최고의 방법은 무엇인가에 대해 이동하는 함수를 호출 주어진 문자열과 함수의 이름에서 파이썬 프로그램입니다.예를 들어,말하자는 내가 모듈 foo, 고 나는 문자열의 내용은 "bar".는 가장 좋은 방법은 무엇입하 call 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 이 패션에서 클래스의 인스턴스에 바인딩 방법 모듈을 수준의 방법,클래스 메소드...the list goes on.

다른 팁

locals()["myfunction"]()

globals()["myfunction"]()

지역 주민 반전으로 현재 지역의 상징이다. 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()

최고의 답변에 따라 프로그래밍 파이썬 FAQ 이 될 것이다:

functions = {'myfoo': foo.bar}

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

의 주요 이점은 이 방법은 문자열이 필요하지 않습의 이름을 일치시키는 기능.이것은 또한 기본 사용하는 기술을 에뮬레이션하는 경우 구조

대답은(I)희망 없이 하고 싶

평가 같은 동작

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

For what it's worth,하는 데 필요한 경우 통과하는 함수(또는 클래스)이름과 응용 프로그램의 이름을 문자열로,다음을 할 수 있다:

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

려고 합니다.이것은 여전히 사용하 eval,그것은 단지 그것을 사용하여 소환 기능에 현재의 컨텍스트.그 후,당신은 실제 기능을 사용하시겠습니까?

주요 혜택은 나를 위해서 당신이 당신을 얻을 것이 어떤 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)

의 아무도는 무엇이었을 권장 도움이되었습니다.나는 이것을 발견 하지만입니다.

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

내가 사용하는 파이썬 2.66

이 질문 는 방법을 동적으로 통화 내에 있는 메서드를 사용하여 클래스 메서드 이름을 지정하는 변수는[중복] 표시된 중복된 것으로이 나는 게시된 응답이 여기:

시나리오는 방법 클래스에서 호출 할 또 다른 방법에 동일한 클래스를 동적으로 추가 몇 가지 정보를 원래의 예를 제공하는 몇 가지 더 넓은 시나리오와명:

class MyClass:
    def __init__(self, i):
        self.i = i

    def get(self):
        func = getattr(MyClass, 'function{}'.format(self.i))
        func(self, 12)   # This one will work
        # self.func(12)    # But this does NOT work.


    def function1(self, p1):
        print('function1: {}'.format(p1))
        # do other stuff

    def function2(self, p1):
        print('function2: {}'.format(p1))
        # do other stuff


if __name__ == "__main__":
    class1 = MyClass(1)
    class1.get()
    class2 = MyClass(2)
    class2.get()

출력(Python3.7.x)

function1:12

function2:12

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top