Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有一种方法可以使用getattr调用动态函数而不使用_导入_;?_Python - Fatal编程技术网

Python 有没有一种方法可以使用getattr调用动态函数而不使用_导入_;?

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

我使用getattr在运行时调用函数。有许多函数,它们存在于几个单独的文件中。我目前的做法如下:

假设函数存在于包/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)
上面的代码工作得很好,但对我来说似乎过于复杂,而且每次调用此方法时,它都必须打开包/函数*.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
中。这可能不是我问这个问题时想要的答案,但现在我认为它更好。