with tutorial framework español djangoproject desde con cero applications python kwargs

python - framework - tutorial django



kwargs analizando las mejores prácticas (6)

Para lograr exactamente lo que pediste, puedes usar

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)

Sin embargo, generalmente preferiría algo como esto:

def f(log=None, bin=None, pid=None, conf=None): self.log = log self.bin = bin self.pid = pid self.conf = conf

Si bien esto todavía es algo repetitivo, el código es realmente fácil de leer. Todos los atributos están intializados con respecto a si se pasa el argumento de palabra clave correspondiente, y la firma de la función documenta claramente los argumentos y sus valores predeterminados.

¿Hay una manera más compacta / eficiente de hacer esto?

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]


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'')


self.__dict__.update(kwargs)


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


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

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

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


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 ha roto como un infierno, nada más. Siempre asegúrese de que todo esté siempre asignado). Sin extra self.log = default_log líneas. Puede omitir el valor predeterminado para obtener None .