Python 有没有一种方法可以使用getattr调用动态函数而不使用_导入_;?
我使用getattr在运行时调用函数。有许多函数,它们存在于几个单独的文件中。我目前的做法如下: 假设函数存在于包/functions_*.py中 实际调用在类方法中完成:Python 有没有一种方法可以使用getattr调用动态函数而不使用_导入_;?,python,Python,我使用getattr在运行时调用函数。有许多函数,它们存在于几个单独的文件中。我目前的做法如下: 假设函数存在于包/functions_*.py中 实际调用在类方法中完成: class SomeClass(object): ... def call(self, **kwargs): function_name = '{}_{}'.format(self.parms['prefix'], self.parms['name']) file_name
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)
上面的代码工作得很好,但对我来说似乎过于复杂,而且每次调用此方法时,它都必须打开包/函数*.py文件(因为它没有import语句)
因为这个方法执行了数千次,所以我不希望代码不必要地低效
问题:有没有更好/更有效的方法?还是我对重复打开文件效率低下的担忧毫无根据
注意:首先导入所有PACKAGE.function_x.py文件(数量不多)对我来说似乎更干净,但之后我无法确定如何使用getattr(模块)对象引用这些导入。为什么不缓存导入的函数?例如,让您的类包含一个
\u cached\u 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)
也许你应该考虑一个插件系统,而不是对<代码> > In IngPuxy <代码>,但我敢打赌它会把导入的模块粘到<代码> sys。模块< /代码>,就像<代码>导入< /代码>和<代码>我不确定它是否隐式执行,但在执行导入之前,您可以始终显式检查模块是否位于
sys.modules
中。这可能不是我问这个问题时想要的答案,但现在我认为它更好。