¿Se considera Pythonic modificar el __dict__ de un objeto para establecer sus propiedades?

12

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?

Skyler
fuente
1
No sé si es Pythonic, pero ciertamente es más común hacerlo en dunder init.
user16764

Respuestas:

10

En Python 3.3, se agregó un nuevo tipo types.SimpleNamespace(), y en la documentación se describe así:

El tipo es más o menos equivalente al siguiente código:

class SimpleNamespace:
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)
    def __repr__(self):
        keys = sorted(self.__dict__)
        items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys)
        return "{}({})".format(type(self).__name__, ", ".join(items))

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.

Martijn Pieters
fuente
Aunque SimpleNamespacees bastante diferente de la mayoría de los tipos en que no tiene un conjunto fijo de atributos.
77
Bueno, hablando de la documentación de Python, de docs.python.org/2/library/stdtypes.html "Un atributo especial de cada módulo es __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 escribir m.__dict__['a'] = 1, que define m.aser 1, pero no puede writem.__dict__ = {}). No se recomienda modificar __dict__directamente ", que es lo que inicialmente me impulsó a hacer esta pregunta.
skyler
@skyler: tenga en cuenta que eso solo menciona el espacio de nombres del módulo . La 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.
Martijn Pieters