2016-07-12 10 views
1

私は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は、第1および第3の実行のために、時には私が欲しい、実行するexemple第二のプラグインのために選択した私は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]を実行していると言いますfor plugin in pluginsが失敗する
  • ElasticSearchDisponibilityAlertは反復可能ではないので、エラーはfor plugin in pluginsが失敗することを示していますが、これは元のリストの2番目のプラグインのタイプです。刃先交換式と反復可能なクラスについて

OLD提案:

ElasticSearchDisponibilityAlertクラスはおそらく、反復可能であるが、​​を実装していません。

あなたが(例えばリスト)あなたは、内部インデックス可能なデータ構造を持っている場合は簡単だろうこれは、それを定義するため、インデックスで検索をサポートすることができます。

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

やプラグインを反復して選択することがitertools.isliceを使用しますO(1)の代わりにO(n = len(プラグイン))というように、各ルックアップをずっと効率の低いものにします。

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

回答ありがとうございます。bすべてのソリューションをあなたが与えないで、2番目の解決策は私に同じ正確なエラーを与える、私のプラグインにあなたのラインコードを置く最初のソリューションが、私はリグートを行う場合は知っているが、同じエラーを与える – 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 
関連する問題