Python не будет eval () код

1

У меня есть следующая вещь eval():

c = Customer()
eval("c.name = row.value('customer', '{c}')".format(c=column_name), { 'c': c, 'row': row})

Когда я пытаюсь запустить это, я получаю следующее:

Traceback (most recent call last):
  File "./import.py", line 19, in <module>
    c = Customer.save_from_row(row)
  File "/home/jason/projects/mcifdjango/mcif/models/customer.py", line 43, in save_from_row
    eval("c.name = row.value('customer', '{c}')".format(c=column_name), { 'c': c, 'row': row})
  File "<string>", line 1
    c.name = row.value('customer', 'name')
           ^
SyntaxError: invalid syntax

Что я делаю неправильно?

Изменить: поскольку похоже, что я недостаточно подробно объяснил контекст моей проблемы, вот что я сделал, если кому-то интересно:

@classmethod
def save_from_row(cls, row):
    c = cls()
    map(lambda column_name: setattr(c, column_name, row.value('customer', column_name)), c.distinguishing_column_names())
    return c.upsert()

Прежде чем я узнал о setattr(), я отдельно устанавливал несколько разных атрибутов на c.

  • 1
    Итак ... что не так с c.name = row.value('customer', column_name) ? Зачем участвовать eval() ?
  • 0
    Потому что у меня есть целый список различных имен столбцов и свойств Customer которые мне нужно назначить.
Показать ещё 2 комментария
Теги:

2 ответа

11
Лучший ответ

eval оценивает выражения. Назначение - это выражение, а не выражение.

И даже не заставляйте меня начинать с того, как легко злоупотреблять и - в 99,99% всех случаев - совершенно ненужный eval. Просто обратитесь к многочисленным другим eval вопросам, я уверен, у каждого есть хотя бы один такой разглагольствованный ответ или комментарий, поэтому я сэкономлю свое дыхание и ссылку на мне нравится. (При этом exec работает как eval для операторов.)

  • 0
    Любая рекомендация о том, что я мог бы сделать вместо Eval?
  • 1
    @ Джейсон: Зависит от того, что вам нужно. В общем, если вы эмулируете переменные PHP-переменных - то есть связываете значения со строками - словарь также будет работать, сохраняя здравомыслие (и будет на порядок быстрее, пока мы на нем).
2

Разве это не сделало бы то, что вам нужно?

c = Customer()
name_cols = (('name', 'custname'), ('addr', 'cust_addr'))
for name, col in name_cols:
    setattr(c, name, row.value('customer', col))

Ещё вопросы

Сообщество Overcoder
Наверх
Меню