имя подстроки переменной python - PullRequest
3 голосов
/ 09 февраля 2012

У меня есть несколько переменных, подобных этой:

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

, и теперь я хочу использовать каждое из этих имен - цикл для их автоматического вызова, например:

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

Я пыталсяиспользуя функцию eval (), но она не работает.Он перестает запускать мою программу.

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

как я могу таким образом объявить имена переменных, используя ключ i?

Ответы [ 4 ]

8 голосов
/ 09 февраля 2012

Используйте список вместо имен индексированных переменных:

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)
2 голосов
/ 09 февраля 2012

Старайтесь по возможности избегать использования eval. В этом случае вы можете использовать getattr:

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

Но я согласен: вместо этого вы должны использовать список (или словарь).

Редактировать: о, и использовать setattr, чтобы установить их:

setattr(self, 'lamp_%d' % i, value)
2 голосов
/ 09 февраля 2012

Вы можете использовать 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)
1 голос
/ 09 февраля 2012

Я предлагаю сделать это так, как предлагает @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)
...