2010-05-10 8 views
9

Básicamente, quiero tomar un diccionariodiccionario de Python a las asignaciones de variables en función del valor clave de nombre de variable

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

y lo utilizan para establecer las variables (en un objeto) que tienen el mismo nombre que una clave en el diccionario.

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

Así, en el extremo del self.a = "barra", self.b = "bla", etc ... (y la tecla "D" se ignora)

¿Alguna idea?

Respuesta

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

Me gusta este enfoque ligeramente mejor. Puede valer la pena señalar que iteritems() se elimina en 3.x a favor de items(). No estoy seguro de qué versión está usando el OP. – Peter

5

Traducción de su declaración class a 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]) 

el método fromdict parece tener la funcionalidad que solicite.

2

Otra opción es utilizar el argumento de desembalaje:

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

¿Puedes explicar este "desempaquetado de argumentos"? – Tengis

+1

@Tengis: 'd = {" a ": 1," b ": 2}; f (** d) 'es lo mismo que' f (a = 1, b = 2) ' – Eric

+0

¡genial y gracias! – Tengis

Cuestiones relacionadas