2011-02-01 2 views
1

나는 다음과 같은 평가() 일을 가지고파이썬 것이다 평가하지() 코드

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'와 뭐가 잘못 ' 고객 ', column_name)'? 'eval()'을 사용하는 이유는 무엇입니까? –

+0

내가 할당해야하는 '고객'의 다른 열 이름과 속성의 전체 목록이 있기 때문에. –

+0

'getattr'과'setattr'을 쓰지 않는 이유는 무엇입니까? –

답변

11

eval을 평가합니다. 할당은 표현식이 아닌 명령문입니다.

그리고 99.99 %의 모든 경우에 완전히 불필요한 오용을 시작하지 않아도됩니다. eval입니다. 단지 수많은 다른 eval 질문을 참조하십시오. 답안이나 댓글에 적어도 한 가지 이상의 호언 장담이 있습니다. 따라서 호흡을 저장하고 one I like에 링크 할 것입니다. (밝혔다되고 있다는 문에 대한 eval 같은 exec 작동합니다.)

+0

내가 eval 대신 무엇을 할 수 있는지에 대한 권장 사항은 무엇입니까? –

+1

@ Jason : 필요한 것에 따라 다릅니다. 일반적으로, [PHP의 변수 변수] (http://www.php.net/manual/en/language.variables.variable.php)를 에뮬레이션하는 경우 (즉, 값을 문자열과 연관시키는 경우) 사전은 (우리가 그것에있는 동안 엄청나게 빠르다.) – delnan

2

이? 당신이 필요

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