2016-05-11 12 views
10

Quanto segue sembra funzionare in entrambi i modi. Qual è il vantaggio (diverso dal bello repr) dell'uso di types.SimpleNamespace? O è la stessa cosa?Qual è la differenza tra SimpleNamespace e la definizione di una classe vuota?

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

@ J.F.Sebastian Grazie. Quello era solo un errore di battitura. Ho usato la sintassi corretta durante il test. – baruch

risposta

18

Questo è spiegato abbastanza bene nella descrizione del modulo types. Esso mostra che types.SimpleNamespace è approssimativamente equivalente a questo:

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__ 

Questo fornisce i seguenti vantaggi rispetto ad un classe vuota:

  1. Consente di inizializzare attributi mentre la creazione dell'oggetto: sn = SimpleNamespace(a=1, b=2)
  2. essa fornisce un readable repr(): eval(repr(sn)) == sn
  3. Sostituisce il confronto predefinito. Invece di confrontare per id(), confronta invece i valori degli attributi.
+7

In altre parole 1- consente di inizializzare gli attributi durante la costruzione dell'oggetto: 'sn = SimpleNamespace (a = 1, b = 2)' 2 Fornisce un 'repr()' leggibile: 'eval (repr (sn)) == sn' 3- sovrascrive il confronto di default (per 'id()' ereditato da 'object'), per confrontare i valori degli attributi. – jfs

+1

Il commento di jfs dovrebbe essere parte della risposta accettata. – yig

Problemi correlati