【问题标题】:Select Classes (plugins) from a Python list从 Python 列表中选择类(插件)
【发布时间】:2023-03-10 07:32:01
【问题描述】:

我在 python 中有一个类(插件)列表,我从一个文件夹中读取它们并将它们存储在一个列表插件中,如下所示:

#Read all classes from plugin folder    
plugnplay.plugin_dirs = ['./plugins']
plugnplay.load_plugins()
plugins = PluginAlerter.implementors()

然后我所有的类都存储在插件列表中

示例:

[<plugins.AddUserAlert.AddUserAlert object at 0x7f593d6d4e90>, <plugins.ElasticSearchDisponibilityAlert.ElasticSearchDisponibilityAlert object at 0x7f593d732210>]

我有一个守护进程来执行我列表中的每个插件,并且像一个魅力一样工作

for plugin in self.plugins:
  #do the rest of code

现在有了这个列表,我想选择第二个插件来执行,有时我想例如执行第一个和第三个,从我的选择中选择不同的插件

如果我选择第二个插件为例,给出这个错误:

#line to select the second plugin
plugins = plugins[1]

File "./Daemon.py", line 78, in __init__ 
    for plugin in self.plugins:
TypeError: 'ElasticSearchDisponibilityAlert' object is not iterable

任何建议或提示?谢谢

【问题讨论】:

    标签: python list python-2.7 class object


    【解决方案1】:

    您尝试迭代“插件”类型的单个项目而不是插件列表:

    # plugins is a list
    plugins = plugins[1]
    # now plugins is a single element
    

    您可以强制插件始终是一个列表:

    self.plugins = [self.plugins[1]]
    

    或更笼统地说:

    # select one or more plugins from the initial list
    self.plugins = selectplugin(self.plugins)
    # check type of plugins
    if not isinstance(self.plugins, list):
        self.plugins = [self.plugins]
    for plugin in self.plugins:
        # do some stuff
    

    【讨论】:

      【解决方案2】:

      新建议

      我认为您正在用单个插件(不可迭代)替换 plugins 列表

      • 您说您正在运行plugins = plugins[1],这将用第二个插件替换可迭代插件,导致for plugin in plugins 失败
      • 错误提示 for plugin in plugins 失败,因为 ElasticSearchDisponibilityAlert 不可迭代,但这是原始列​​表中第二个插件的类型,使得这种情况更有可能发生。

      关于可索引和可​​迭代类的旧建议:

      ElasticSearchDisponibilityAlert 类可能是可迭代的,但没有实现 __getitem__

      您可以定义它,从而支持按索引查找,如果您在内部有可索引的数据结构(例如列表),这将很容易:

      def __getitem__(self, key):
        return self._internal_list_of_plugins[key]
      

      或者使用itertools.islice 遍历插件并选择一个,这会使每次查找的效率大大降低,O(n=len(plugins)) 而不是 O(1)。

      # Grab the 2nd plugin at index 1
      i = 1
      plugin = itertools.islice(plugins, i, i+1).next()
      

      【讨论】:

      • 感谢您的回答,但是您提供的每个解决方案都不起作用,第二个解决方案给我同样的错误,第一个解决方案我将您的行代码放在我的插件中,但我不知道是否可以没错,但给出同样的错误
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-02
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      • 2016-02-16
      • 1970-01-01
      • 2014-02-12
      相关资源
      最近更新 更多