2011-04-11 13 views
18

¿Existe alguna forma más compacta/eficiente de hacer esto?kwargs mejor práctica de análisis

for key in kwargs: 
     if key == 'log': 
      self.log = kwargs[key] 
     elif key == 'bin': 
      self.bin = kwargs[key] 
     elif key == 'pid': 
      self.pid = kwargs[key] 
     elif key == 'conf': 
      self.conf = kwargs[key] 

Respuesta

32
for key in ('log', 'bin', 'pid', 'conf'): 
    if key in kwargs: 
     setattr(self, key, kwargs[key]) 

o

self.__dict__.update((key, kwargs[key]) 
        for key in ('log', 'bin', 'pid', 'conf') 
        if key in kwargs) 
+5

¡Agradable! Podría ser aún más corto con el valor predeterminado: 'for key in (...): setattr (self, key, kwargs.get (key))' – pajton

+0

@pajton: Por supuesto, pero traté de mantenerme tan cerca del código OP como sea posible. –

+0

@pajton ¿Por qué se quita la línea 'if key in kwargs:' en su sugerencia? ¿Por qué no verificar 'if key in kwargs'? –

2
for k,v in kw.items(): 
    setattr(self, k, v) 
5

Si la clave proporcionada en get() no está en el diccionario, el resultado es None.

self.log = kwargs.get('log') 
self.bin = kwargs.get('bin') 
self.pid = kwargs.get('pid') 
self.conf = kwargs.get('conf') 
1

self.__dict__.update(kwargs)

+0

Esto puede ser muy peligroso y es hacky en cualquier dirección. – delnan

21
self.log = kwargs.get('log', default_log) 
self.bin = kwargs.get('bin', default_bin) 
self.pid = kwargs.get('pid', default_pid) 
self.conf = kwargs.get('conf', default_conf) 

Esto tiene la ventaja adicional de que self.log se asigna en cualquier caso (AttributeError significa que su código se rompe como el demonio, nada más . Siempre asegúrese de que todo esté siempre asignado.). Sin líneas extra self.log = default_log. Puede omitir el valor predeterminado para obtener None.

2
for k,v in kwarg.iteritems(): 
    setattr(self, k, v) 

En lo que setattr(self, "bin", "val") es como llamar self.bin = "val"

Sin embargo es más deseable tener una lista blanca como @Sven Marnach tiene.