我使用getattr在运行时调用函数。有许多功能,它们存在于几个单独的文件中。我目前正在通过以下方式执行此操作:
将这些功能置于PACKAGE / functions _ *。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(模块)对象来引用这些导入。 / p>
答案 0 :(得分: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)