2012-08-08 69 views
0

我正在使用getattr在運行時調用函數。有許多功能,他們生活在幾個單獨的文件。我目前正在做這通過以下方式:有沒有辦法使用getattr調用動態函數而不使用__import__?

說出職能住在PACKAGE /功能_ * PY

的實際調用是一個類的方法來完成:

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(module)對象來引用這些導入。

+4

也許你應該考慮一個插件系統。 – 2012-08-08 10:53:26

+1

不確定'__import__',但我敢打賭,它將導入的模塊像'import'和'importlib.import_module'一樣粘貼到'sys.modules'中。我不確定它是否隱式執行,但在導入之前,您總是可以顯式檢查模塊是否在'sys.modules'中。 – 2012-08-08 10:56:13

回答

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

這可能不是我在問這個問題時尋找的答案,但現在我認爲它更好。 – 2012-08-09 02:41:40

相關問題