python - library - ¿Cuál es la diferencia entre SimpleNamespace y la definición de clase vacía?
python intflag (1)
Esto se explica bastante bien en la descripción del módulo de types . Te muestra que types.SimpleNamespace
es aproximadamente equivalente a esto:
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))
def __eq__(self, other):
return self.__dict__ == other.__dict__
Esto proporciona las siguientes ventajas sobre una clase vacía:
- Le permite inicializar atributos mientras construye el objeto:
sn = SimpleNamespace(a=1, b=2)
- Proporciona un
repr()
legiblerepr()
:eval(repr(sn)) == sn
- Anula la comparación por defecto. En lugar de comparar por
id()
, compara los valores de los atributos.
Lo siguiente parece funcionar de cualquier manera. ¿Cuál es la ventaja (aparte de la buena repr
) de usar types.SimpleNamespace
? ¿O es la misma cosa?
>>> import types
>>> class Cls():
... pass
...
>>> foo = types.SimpleNamespace() # or foo = Cls()
>>> foo.bar = 42
>>> foo.bar
42
>>> del foo.bar
>>> foo.bar
AttributeError: ''types.SimpleNamespace'' object has no attribute ''bar''