operator library intflag enumerador enum python python-3.x

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:

  1. Le permite inicializar atributos mientras construye el objeto: sn = SimpleNamespace(a=1, b=2)
  2. Proporciona un repr() legible repr() : eval(repr(sn)) == sn
  3. 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''