2012-02-09 5 views
3

私はこのようないくつかの変数があります。ストリング変数名パイソン

for i in range(1,5): 
    self.canvas.itemconfig(self.lamp_/number_i_automaticly/, fill=self.color_blink) 

私が試した:

self.lamp_1 
self.lamp_2 
self.lamp_3 
self.lamp_4 

と、今私は、この名前のそれぞれは、このように、自動にそれらを呼び出すためにループで使用したいです関数eval()を使用しても動作しません。私のプログラムの実行を停止します。

eval("self.canvas.itemconfig(self.lamp_"+str(i)+",fill=self.color_blink)") 

どのようにして、キーiを使用して、そのように変数の名前を格闘することができますか?

答えて

2

あなたができますこれにはgetattrを使用します。

for i in range(1,5): 
    self.canvas.itemconfig(getattr(self, 'lamp_%s' % i), 
          fill=self.color_blink) 

しかし、あなたは本当にこのような変数の名前を付けてはいけません。それらをリストに入れて繰り返します:

self.lamps = [self.lamp_1, self.lamp_2, self.lamp_3, self.lamp_4] 
for lamp in self.lamps: 
    self.canvas.itemconfig(lamp, fill=self.color_blink) 
+0

私はこれを使用しました: 'self.canvas.itemconfig(eval(" self.lamp_ {0} "。format(i))、 fill = self.color_blink)' 正常に動作します!どうもありがとう!! – greg

+0

@greg:インデックス付きの変数名を使用することは非常に悪い考えです。 getattr()の代わりに 'eval()'を使ってアクセスするのはさらに悪い考えです。私たちのアドバイスを無視しないであなた自身に恩恵を与えてください! :) –

8

代わりにインデックス付き変数名のリストを使用してください:あなたは、インデックス付きの変数名(あなたはいけない)を使用して主張

self.lamps = [lamp_1, lamp_2, lamp_3, lamp_4] 

場合は、getattr()を使用することができます。

for i in range(1, 5): 
    self.canvas.itemconfig(getattr(self, "lamp_%i" % i), 
          fill=self.color_blink) 
+0

のgetattr()が正常に動作しません。それは議論で間違っていると言います。それは何でしょうか? – greg

+0

@greg:どうすればわかるのですか?あなたは何を試したのか、どのようなエラーメッセージが出たのか教えてくれませんでした。 :) –

+0

私は問題が何かを知る。これはバージョン2.7用で、3.2を使用しています。うまく動作します。ありがとうございました。 – greg

1

@SvenMarnachが示唆するように、これを行うことをお勧めします。あなたlamp_1など、いくつか外部理由で必見使用している場合しかし、あなたはrange()からのあなたのループを変更する必要があります。

for lamp in (self.lamp_1, self.lamp_2, self.lamp_3, self.lamp_4): 
    self.canvas.itemconfig(lamp, fill=self.color_blink) 
2

可能な限りのevalを使用しないようにしてください。この場合、あなたはgetattrを使用することができます。

for i in range(1, 5): 
    value = getattr(self, 'lamp_%d' % i) 

しかし、私は同意する:あなたの代わりに、リスト(または辞書)を使用する必要があります。

編集:ああ、それらを設定するためにsetattrを使用します。

setattr(self, 'lamp_%d' % i, value) 
関連する問題