2010-05-10 11 views
9

Về cơ bản, tôi muốn để có một từ điểnPython từ điển để tập biến dựa trên giá trị chìa khóa để tên biến

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

và sử dụng nó để thiết lập các biến (trong một Object) có cùng tên với một khóa trong từ điển.

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

Vì vậy, trong các self.a cuối = "bar", self.b = "blah", vv ... (và chìa khóa "d" bị bỏ qua)

Bất kỳ ý tưởng?

Trả lời

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

Tôi thích phương pháp này tốt hơn một chút. Có thể đáng chú ý mặc dù iteritems() được loại bỏ trong 3.x ủng hộ các mục(). Bạn không chắc chắn phiên bản OP đang sử dụng. – Peter

5

Dịch tuyên bố class của bạn để 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]) 

phương pháp fromdict dường như có các chức năng bạn yêu cầu.

2

Một lựa chọn khác là sử dụng lập luận giải nén:

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

Bạn có thể giải thích điều này "giải nén đối số" không? – Tengis

+1

@Tengis: 'd = {" a ": 1," b ": 2}; f (** d) 'giống với' f (a = 1, b = 2) ' – Eric

+0

tuyệt vời và cảm ơn! – Tengis