2014-02-16 2 views
1

간단한 RESTful API와 피비 관리 데이터 저장소 간 간단한 개체 마샬링을 수행합니다. 그러나,이 패턴은 (formcgi.FieldStorage()의 출력되는) 오는 계속해서 : 이것은 물론, crufty 및 하드 유지하는 것입니다Python 개체의 필드/멤버를 이름으로 설정하는 방법

if form.getfirst('From'): msg.msg_from=form.getfirst('From') 
if form.getfirst('To'): msg.msg_to=form.getfirst('To') 
if form.getfirst('Body'): msg.msg_body=form.getfirst('Body') 

.

keyMapping = { 'From': 'msg_from', 
       'To': 'msg_to', 
       'Body': 'msg_body' } 
for k, v in keyMapping: 
    if form.getfirst(k): msg.SET_FIELD_VALUE(v, form.getfirst(k)) 

은 분명히 내가 찾을 수 없습니다 해요 SET_FIELD_VALUE입니다 : 내가 차라리 할 거라고하면이 같은 것을 가지고있다. 나는 내가 어떻게 eval을 사용하여 그것을 할 수 있는지 알고있다. 그러나 차라리 분명히 피하고 싶다. 실제 패턴은 필드 참조 나 반사 API 등의 형식을 실제로 포함 할 수도 있지만, 아무것도 찾을 수 없다는 것을 알고있다. 어떻게 그렇게 할 것인가에 대해서.

답변

4

사용 setattr :

keyMapping = { 'From': 'msg_from', 
       'To': 'msg_to', 
       'Body': 'msg_body' } 
for k, v in keyMapping.items(): 
    if form.getfirst(k): 
     setattr(msg, v, form.getfirst(k)) 

BTW, 당신은 items() 또는 iteritesm()을 사용해야합니다. 그렇지 않으면, iterating dictiaonary는 키를 산출합니다. setattr


사용 예제 : 단순히 작동

>>> class Klass: 
...  def __init__(self): 
...   self.a = 1 
...   self.b = 2 
... 
>>> x = Klass() 
>>> setattr(x, 'a', 3) 
>>> x.a 
3 
+0

감사합니다. 나는 다시 파이썬 문서를 다시 읽을 필요가 있다고 생각한다. – fluffy