2011-02-01 27 views
1

我有以下的eval()的事情:Python將不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()」? – 2011-02-01 19:39:55

+0

因爲我有一個我需要分配的`Customer`的不同列名和屬性的完整列表。 – 2011-02-01 19:42:59

回答

11

eval評價表達式。作業是一個陳述,而不是一個表達。

甚至沒有讓我開始如何輕鬆地濫用和 - 在所有情況下99.99% - 完全不需要eval是。請參閱其他衆多eval問題,我敢打賭,每個人在回答或評論中至少有一次這樣的咆哮 - 所以我會保存我的呼吸並鏈接到one I like。 (話雖這麼說,exec作品像eval的發言。)

2

這是不是你所需要的?:

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