2011-02-01 6 views
1

I次の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

そう...必要なものをしないだろう(文ためevalようexec作品、言われていること。) customer '、column_name) '? 'eval()'が関わるのはなぜですか? –

+0

私は割り当てる必要がある 'Customer'の異なる列名とプロパティの全リストを持っています。 –

+0

なぜ 'getattr'と' setattr'を使わないのですか? –

答えて

11

evalは、の式を評価する。代入は文であり、式ではありません。

また、どのようにしても99.99%のすべてのケースで非常に不便な使い方を開始することさえできません。evalです。他の多くの質問を参照するだけで、回答やコメントに少なくとも1つの暴言があることになるので、私は息を救い、one I likeにリンクします。

+0

evalの代わりに私が何をするかについての推奨事項はありますか? –

+1

@Jason:必要なものによって異なります。一般に、[PHPの変数変数](http://www.php.net/manual/en/language.variables.variable.php)をエミュレートする場合(つまり値を文字列に関連付ける場合)、辞書は(そして、私たちがそれに遭遇している間には、より速いオーダーになります)。 – delnan

2

が、これはあなたが?: `c.name = row.value(」と間違って何

c = Customer() 
name_cols = (('name', 'custname'), ('addr', 'cust_addr')) 
for name, col in name_cols: 
    setattr(c, name, row.value('customer', col)) 
関連する問題