从Python列表中选择类(插件)

2024-10-03 19:24:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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

有什么建议或提示吗?谢谢


Tags: theinself文件夹插件列表forobject
2条回答

新建议

我认为您正在用一个插件替换plugins列表(这是不可编辑的)

  • 你说你正在运行plugins = plugins[1],这将用第二个插件替换iterable插件,使得for plugin in plugins失败
  • 错误提示for plugin in plugins失败,因为ElasticSearchDisponibilityAlert不可iterable,但这是原始列表中第二个插件的类型,使得这种情况更为可能。你知道吗

关于可转位和可转位类的旧建议:

ElasticSearchDisponibilityAlert类可能是iterable,但没有实现^{}。你知道吗

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

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()

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

# 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

相关问题 更多 >