파이썬 프로그램에서 함수 이름을 가진 문자열이 주어진 함수를 호출하는 가장 좋은 방법은 무엇입니까? 예를 들어 모듈 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")()