我正在使用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)對象來引用這些導入。
也許你應該考慮一個插件系統。 – 2012-08-08 10:53:26
不確定'__import__',但我敢打賭,它將導入的模塊像'import'和'importlib.import_module'一樣粘貼到'sys.modules'中。我不確定它是否隱式執行,但在導入之前,您總是可以顯式檢查模塊是否在'sys.modules'中。 – 2012-08-08 10:56:13