2016-07-12 4 views
1

ich eine Liste von Klassen (Plugins) in Python haben, las ich sie aus einem Ordner und speichern sie in einer Liste Plugins, wie folgt aus:Select Classes (Plugins) aus einer Python-Liste

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

dann alle meine Klassen wird in Plugins Liste gespeichert

exemple:

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

ich habe einen Dämon jedes einzelne Plug-in meiner Liste auszuführen und arbeiten wie ein Zauber

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

jetzt mit dieser Liste i für exemple das zweite Plugin, manchmal will ich für exemple auszuführen wählen möchten führen Sie das erste und das dritte, wählen Sie differents Plugin von meiner Wahl

, wenn ich für exemple zweiten Plugin gewählt Geben Sie diesen Fehler ein:

#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 

ein Tipp? Dank

Antwort

1

NEW Vorschlag

Ich glaube, Sie die plugins Liste mit einem einzigen Plugin sind ersetzt

  • Sie sagen, Sie laufen plugins = plugins[1] (was nicht iterable ist), die die iterable Plugins ersetzen würde mit dem 2. Plugin, for plugin in plugins Fehler machen
  • Der Fehler schlägt vor, for plugin in plugins schlägt fehl, weil ist nicht iterierbar, aber das ist der Typ des 2. Plugin in der ursprünglichen Liste, so dass dies noch wahrscheinlicher.

OLD Vorschläge über Wende und iterable Klassen:

Die ElasticSearchDisponibilityAlert Klasse wahrscheinlich iterable ist aber nicht __getitem__ implementieren.

Sie können es definieren und somit Lookup durch den Index unterstützen, die einfach sein würde, wenn Sie eine Wendedatenstruktur intern (zB eine Liste):

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

Oder itertools.islice verwenden, um über den Plugins iterieren und wählen eine, die jedes Nachschlagen viel weniger effizient machen würde, O (n = len (plugins)) anstelle von O (1).

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

danke für die Antwort, b ut jede Lösung, die Sie geben, funktioniert nicht, die zweite Lösung gibt mir die gleiche exakte errot, die erste Lösung, die ich Ihre Zeilencodes in meinem Plugin, aber ich weiß nicht, ob ein rigltt, aber geben Sie den gleichen Fehler – Ricardo

2

Sie versuchen, ein einzelnes Element des Typs iterieren "Plugins" statt einer Liste von Plugins:

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

Sie Plugins zwingen kann immer eine Liste zu sein:

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

oder allgemeiner:

# 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 
Verwandte Themen