有没有办法使用getattr来调用动态函数而不使用__import__?

时间:2012-08-08 10:51:38

标签: python

我使用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>

1 个答案:

答案 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)