2012-08-08 2 views
0

getattr을 사용하여 런타임에 함수를 호출합니다. 많은 기능이 있으며 몇 개의 개별 파일에 있습니다.__import__을 사용하지 않고 getattr을 사용하여 동적 함수를 호출하는 방법이 있습니까?

class SomeClass(object): 
    ... 

    def call(self, **kwargs): 
     function_name = '{}_{}'.format(self.parms['prefix'], self.parms['name']) 
     file_name = self.parms['prefix'] 
     mod_name = 'PACKAGE.{}'.format(file_name) 
     module = __import__(mod_name, globals(), locals(), [file_name,]) 
     return getattr(module, function_name)(**kwargs) 

위의 코드는 잘 작동합니다. 실제 통화가 클래스 메서드에서 이루어집니다

_ * 평

이 기능은 패키지/기능에 살고 말 : 나는 현재이 다음과 같은 방법을하고있는 중이 야 ,하지만 나에게 지나치게 복잡한 것처럼 보입니다. 또한이 메소드가 호출 될 때마다 PACKAGE/function _ *. py 파일을 열어야하는 것처럼 보입니다 (import 문이 없기 때문에).

이 메서드는 수천 번 실행되기 때문에 코드를 불필요하게 비효율적으로 만들고 싶지 않습니다.

질문 : 더 효율적이고 효과적인 방법이 있습니까? 아니면 반복적 인 파일 열기의 비효율에 대한 우려가 근거가 없습니까?

참고 : 처음에는 모든 PACKAGE.function_x.py 파일을 가져 오는 것이 더 깔끔해 보였지만, getattr (모듈) 개체를 사용하여 이러한 가져 오기를 참조하는 방법을 찾지 못했습니다.

+4

아마도 플러그인 시스템을 고려해야합니다. –

+1

'__import__ '에 대해서는 잘 모르겠지만 import 모듈과 importlib.import_module처럼'sys.modules'에 임포트 된 모듈을 붙일 것입니다. 나는 암묵적으로하는지 잘 모르겠지만 임포트를하기 전에 모듈이'sys.modules'에 있는지 항상 명시 적으로 확인할 수 있습니다. –

답변

2

가져온 기능을 캐시하지 않는 이유는 무엇입니까? 예 : 수업에 _cached_func 사전이 포함되도록하십시오.

class SomeClass(object): 
    def __init__(self): 
     self._cached_func = {} 

    def call(self, **kwargs): 
     function_name = '{}_{}'.format(self.parms['prefix'], self.parms['name']) 

     try: 
      func = self._cached_func[function_name] 
     except KeyError:    
      file_name = self.parms['prefix'] 
      mod_name = 'PACKAGE.{}'.format(file_name) 
      module = __import__(mod_name, globals(), locals(), [file_name,]) 
      func = getattr(module, function_name) 
      self._cached_func[function_name] = func 

     return func(**kwargs) 
+0

이것은 질문을했을 때 찾고 있던 대답이 아닐지 모르지만 지금은 더 나아 졌다고 생각합니다. –

관련 문제