Tengo una clase que infla los objetos de las filas encontradas en una base de datos (u otra fuente, por ejemplo, MongoDB, un archivo CSV, etc.). Para establecer las propiedades del objeto, hace algo como self.__dict__.update(**properties)
o obj.__dict__.update(**properties)
.
¿Se considera esto pitónico? ¿Es este un buen patrón que debería seguir usando, o se considera una forma incorrecta?
Respuestas:
En Python 3.3, se agregó un nuevo tipo
types.SimpleNamespace()
, y en la documentación se describe así:Tenga en cuenta el
__init__
método del tipo; no puede obtener un mejor respaldo de la técnica que la documentación de Python.fuente
SimpleNamespace
es bastante diferente de la mayoría de los tipos en que no tiene un conjunto fijo de atributos.__dict__
. Este es el diccionario que contiene la tabla de símbolos del módulo. La modificación de este diccionario realmente cambiará el símbolo del módulo tabla, pero la asignación directa al__dict__
atributo no es posible (puede escribirm.__dict__['a'] = 1
, que definem.a
ser 1, pero no puedewritem.__dict__ = {}
). No se recomienda modificar__dict__
directamente ", que es lo que inicialmente me impulsó a hacer esta pregunta.globals()
función devuelve el mismo espacio de nombres y, por lo general, hay mejores formas de resolver problemas que establecer dinámicas globales, de ahí la advertencia.