0

我正在使用 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 文件(因为它没有导入语句)。

因为这个方法被执行了数千次,我不希望代码不必要地低效。

问题:有没有更好/更有效的方法来做到这一点?还是我对重复打开文件效率低下的担忧毫无根据?

注意:首先导入所有 PACKAGE.function_x.py 文件(没有很多)对我来说似乎更干净,但后来我不知道如何使用 getattr(模块)对象来引用这些导入。

4

1 回答 1

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)
于 2012-08-08T11:08:06.447 回答