In Python 3.4+, perché dovrei usare namedtuple su SimpleNamespace quando non uso dict, sembrano molto simili

7

Ad un certo punto o in un altro potresti venire sopra le funzioni con molti argomenti. A volte ha senso combinare alcuni argomenti in super-argomenti. L'ho spesso fatto con i dicts, ma ora sto cercando modi migliori per farlo.

Mi piacerebbe girare ...

def do_something(ax, ay, az, bu, bv, c):
    # Do something

... in ...

def do_something(a, b, c):
    # Do something

... dove a e b contengono le loro sottozone.

Un modo per farlo è:

A = namedtuple('A', 'a, b, c')
a = A(ax, ay, az)
B = namedtuple('B', 'u, v')
b = B(bu, bv)

Tuttavia, questo sembra più semplice:

a = SimpleNamespace(x=ax, y=ay, z=az)
b = SimpleNamespace(u=bu, v=bv)

Qual è l'inconveniente? Il fatto che a e b non sono ben scritti? Non sono oggetti A e B?

(Btw, non preoccuparti dei nomi delle variabili, normalmente non utilizzo come nomi di variabili brevi.)

    
posta André Christoffer Andersen 28.05.2017 - 15:37
fonte

2 risposte

12

SimpleNamespace è fondamentalmente solo una bella facciata su un dizionario. Ti permette di usare proprietà al posto delle chiavi dell'indice. Questo è bello in quanto è super flessibile e facile da manipolare.

Lo svantaggio di questa flessibilità è che non fornisce alcuna struttura. Non c'è niente che impedisca a qualcuno di chiamare SimpleNamespace(x=ax, y=ay) (e del a.z in un momento successivo). Se questa istanza viene passata alla tua funzione, l'eccezione si verifica quando tenti di accedere al campo.

Al contrario, namedtuple ti consente di creare un tipo strutturato. Il tipo avrà un nome e saprà quali campi deve avere. Non potrai creare un'istanza senza ciascuno di questi campi e non potranno essere rimossi in seguito. Inoltre, l'istanza è immutabile, quindi saprai che il valore in a.x sarà sempre lo stesso.

Dipende da te decidere se hai bisogno della flessibilità che ti offre SimpleNamespace o se preferisci avere la struttura e le garanzie fornite da namedtuple .

    
risposta data 28.05.2017 - 16:14
fonte
1

Riepilogo di SimpleNamespace

Permette di inizializzare gli attributi durante la costruzione dell'oggetto:

sn = SimpleNamespace(a=1, b=2)

Fornisce una leggibilità

repr(): eval(repr(sn)) == sn

Sostituisce il confronto predefinito. Invece di confrontare per id() , confronta invece i valori degli attributi.

    
risposta data 28.02.2018 - 15:47
fonte

Leggi altre domande sui tag