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