2016-07-12 2 views
1

У меня есть список классов (плагинов) в Python, я прочитал их из папки и сохранять их в списке плагинов, например:Выберите классы (плагины) из списка Python

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

тогда все мои классы хранятся в списке плагинов

Exemple:

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

у меня есть демон, чтобы выполнить каждый плагин в моем списке, и работать как шарм

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

теперь с этим списком я хочу выбрать для Exemple второй плагин для выполнения, иногда я хочу для Exemple выполнить первый и третий, выберите Дифференц плагин от моего Choise

если я выбрал для Exemple второго плагина введите эту ошибку:

#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 

любой совет или совет? благодаря

ответ

1

NEW предложение

Я думаю, что вы заменить plugins список с одним плагином (который не является итерацию)

  • Вы говорите, что вы работаете plugins = plugins[1], который заменит Iterable плагины со вторым плагином, делая for plugin in plugins fail
  • Ошибка указывает, что for plugin in plugins не удается выполнить, потому что ElasticSearchDisponibilityAlert не является истребителем, но это тип второго плагина в исходном списке, что делает его еще более вероятным.

OLD предложение о многогранных и Iterable классов:

ElasticSearchDisponibilityAlert класса, вероятно итерации, но не реализует __getitem__.

Вы можете определить его и, таким образом, поддерживает поиск по индексу, который будет легко, если у вас есть индексируемая структуру данных внутренне (например, список):

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

Или использовать itertools.islice для перебора плагинов и выбрать один, что сделает каждый поиск намного менее эффективным, O (n = len (плагины)) вместо O (1).

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

благодарит за ответ, b каждое решение, которое вы даете, не работает, второе решение дает мне то же самое errot, первое решение, которое я ставлю ваши строки в свой плагин, но я не знаю, если это сделать, но дайте ту же ошибку – Ricardo

2

Вы пытаетесь перебирать один элемент типа «плагинов» вместо списка плагинов:

# 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