У меня есть следующая вещь 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
.
eval
оценивает выражения. Назначение - это выражение, а не выражение.
И даже не заставляйте меня начинать с того, как легко злоупотреблять и - в 99,99% всех случаев - совершенно ненужный eval
. Просто обратитесь к многочисленным другим eval
вопросам, я уверен, у каждого есть хотя бы один такой разглагольствованный ответ или комментарий, поэтому я сэкономлю свое дыхание и ссылку на мне нравится. (При этом exec
работает как eval
для операторов.)
Разве это не сделало бы то, что вам нужно?
c = Customer()
name_cols = (('name', 'custname'), ('addr', 'cust_addr'))
for name, col in name_cols:
setattr(c, name, row.value('customer', col))
c.name = row.value('customer', column_name)
? Зачем участвоватьeval()
?Customer
которые мне нужно назначить.