2010-05-10 135 views
9

基本上,我希望採取Python字典到變量賦值基於鍵值爲變量名

字典等{ "a":"bar", "b":"blah", "c":"abc", "d":"nada" }

並用它來設置變量(在對象),它們具有相同的名稱作爲字典中的一個關鍵字。

class Foo(object) 
{ 
    self.a = "" 
    self.b = "" 
    self.c = "" 
} 

所以在年底self.a = 「酒吧」,self.b = 「嗒嗒」,等...(和鍵 「d」 被忽略)

任何想法?

回答

3
class Foo(object): 
    a, b, c = "", "", "" 

foo = Foo() 

_dict = { "a":"bar", "b":"blah", "c":"abc", "d":"nada" } 
for k,v in _dict.iteritems(): 
    if hasattr(foo, k): 
     setattr(foo, k, v) 
+0

我喜歡這種方法略勝一籌。可能值得注意的是,iteritems()在3.x中被移除以支持items()。不確定OP使用的是什麼版本。 – Peter 2010-05-10 03:28:06

5

翻譯您class語句的Python,

class Foo(object): 
    def __init__(self): 
    self.a = self.b = self.c = '' 
    def fromdict(self, d): 
    for k in d: 
     if hasattr(self, k): 
     setattr(self, k, d[k]) 

fromdict方法似乎有您請求的功能。

2

另一種選擇是使用參數拆包:

class Foo(object): 
    def __init__(self, a='', b='', c='', **kwargs) 
     self.a = a 
     self.b = b 
     self.c = c 

d = { "a":"bar", "b":"blah", "c":"abc", "d":"nada" } 

f = Foo(**d) 
+1

你能解釋一下這個「論證拆包」嗎? – Tengis 2012-11-29 19:23:35

+1

@Tengis:'d = {「a」:1,「b」:2}; f(** d)'與'f(a = 1,b = 2)'相同' – Eric 2012-11-29 19:56:57

+0

很酷,謝謝! – Tengis 2012-11-29 20:56:55