Python: 2.6: Попытка построить оператор, такой как exec ('if' + varname + '<1.0:') - PullRequest
0 голосов
/ 15 декабря 2011

Моя цель здесь состоит в том, чтобы иметь такой же оператор if в цикле for, если имя переменной было изменено Эти операторы находятся в функции в другом файле: соответствующая схема импорта как было установлено.

Примеры:

for i in range(0,10):

    myvar = ''
    myvar = myvar + str(i)
    exec('if' + myvar + '< 0:')
`do something`

В нем говорится о том, чтобы сделать что-то часть "неожиданный идентификатор" Я удаляю Ident и это сказать; KeyError: 'myvar1' Я попытался использовать это вместо

if vars()[myvar] < 0:

    do something 

Это дает мне то же самое KeyError: 'myvar1'

Есть ли способ заставить такую ​​переменную инструкцию работать?

Ответы [ 3 ]

3 голосов
/ 15 декабря 2011

Вы передаете строку «if 0 <0:» в функцию exec ().Это не синтаксически допустимая конструкция - в ней отсутствует контролируемый набор.Вместо этого вы могли бы рассмотреть: </p>

if eval(myvar) < 0:
    do_something()

Однако в качестве более общего замечания динамическая оценка имен переменных почти всегда является неправильной вещью в производственной программе.Обычно лучше использовать dict для сопоставления ключей со значениями (для этого они и нужны, и вы избегаете использования exec () и eval ()).

1 голос
/ 15 декабря 2011

Так что вам действительно нужно просто изменить код, чтобы сохранить myvarN в виде списка.Тогда вы можете просто сделать:

for element in myvars:
    if element < 0:
        doSomething(element)
0 голосов
/ 15 декабря 2011

Если вы пытаетесь сделать что-то вроде этого:

var1 = 10
var2 = 12
var3 = 18

for i in range(10):
  if locals().get('var%d' % i, 0) > 10:
    # something here for the conditions that pass.

Этот код должен работать. Самое большое отличие от того, что вы сделали, это то, что я назвал .get() на locals(), так что если вы попытаетесь протестировать несуществующую переменную, она вернется с чем-то. Это ... странный подход, но иногда нужны странные подходы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...