2014-08-31 6 views
8

Sembra che l'unica "ragione" sia che OrderedDict è scritto in Python, mentre defaultdict è in C. Ma sembra che questo stia cambiando poiché Python 3.5 dovrebbe avere un cOrderedDict (vedere Python Bugs), che evidenzia come la mia unica spiegazione è in realtà.Perché OrderedDict è denominato in caso cammello mentre defaultdict è in minuscolo?

Qualcuno può fornire una spiegazione migliore? Spero che ci sia un motivo migliore.

Edit: La risposta alleged duplicate è OK per Python 2.7, non per Python 3 in cui la classe/tipo di distinzione è andato. OrderedDict e defaultdict sono entrambe le classi considerate dall'interprete stessa:

>>> collections.defaultdict 
<class 'collections.defaultdict'> 
>>> collections.OrderedDict 
<class 'collections.OrderedDict'> 
+1

"Ora che le classi e i tipi dovrebbero essere unificati, la differenza tra CamelCase per le classi Python e minuscole per i tipi C è frustrantemente scomoda." - user2357112, da un commento nel duplicato contrassegnato. – user2864740

+0

Indirizzare il punto "questo sta cambiando": non è così che python 3 fa le implementazioni. Ad esempio py3, si esegue l'importazione sottaceto e questo delegato a importare _pickle - l'implementazione c, se disponibile. – roippi

+0

Grazie, @roippi, mi riferivo alle patch in che sono chiamate 'cOrderedDict'. Il fatto che entrambe le versioni C e Python vengano importate con lo stesso nome è irrilevante. Le convenzioni di denominazione per 'defaultdict' e' OrderedDict' continuano a non corrispondere. –

risposta

11

Sulla base di quello che posso trovare sugli archivi python-dev, questo è solo un caso di sviluppatori non seguendo le proprie linee guida.

Guido realtà suggerito renaming defaultdict to DefaultDict per risolvere questa incoerenza durante la discussione del PEP che ha introdotto OrderedDict:

In ogni caso, sembra che il modulo di collezioni in particolare, è già internamente incoerente - NamedTuple vs. defaultdict. In un certo senso, defaultdict è quello strano qui fuori, dato che sono cose che importa da qualche modulo, non sono built-in. Forse dovrebbe essere rinominato in NamedDict?

Nota che NamedDict è un errore di battitura, he meant DefaultDict:

> Suppongo che dire "defaultdict".

Sì, sono stato distratto. :-(

Io non sono sicuro perché questo cambiamento (e le modifiche simili per gli altri moduli, per esempio socket.socket, datetime.datetime) non è mai stato fatto, dal momento che Guido ha sostenuto farlo.

Ironia della sorte, (o forse Alex Martelli) che è venuto con il nome defaultdict, nonostante il fatto che sono stati basandosi su una classe interna di Google stava usando chiamato DefaultDict:

Google ha un tipo di dati interno chiamato un DefaultDict che ottiene 012.351.ha passato un valore predefinito al momento della costruzione. Il metodo __getitem__, invece di aumentare KeyError, inserisce una copia superficiale (!) Del valore predefinito nel dict quando il valore non viene trovato.

... snip ...

Durante la colazione con Alex Martelli, ha proposto che una sottoclasse di dict con questo comportamento (ma implementato in C) sarebbe una buona aggiunta al la lingua. Sembra che non sia difficile da implementare.Potrebbe essere un predefinito defaultdict. Il primo argomento obbligatorio per il costruttore dovrebbe essere il valore predefinito. Gli argomenti rimanenti (anche gli argomenti di parole chiave ) vengono passati invariati al costruttore di dict.

Discussione spostato rapidamente da defaultdict essere un built-in al fatto che è parte del modulo collections, ma il nome tutto minuscolo bloccati. Questa discussione si è svolta nel 2006, quindi PEP 8 era in circolazione da molti anni. Non sono sicuro del motivo per cui non è mai venuto in mente a nessuno che dovesse essere chiamato DefaultDict al momento.

+0

Sono abbastanza sicuro che il tipo interno di Google sia stato implementato in Python, quindi userebbe la convenzione di denominazione Python. – user2357112

+3

@ user2357112 Nella stessa discussione in cui è stato discusso 'OrderedDict', [Guido ha detto questo] (https://mail.python.org/pipermail/python-dev/2009-March/086639.html) in risposta a un suggerimento simile (che le classi implementate in C dovrebbero essere denominate in minuscolo): * "Quindi hanno torto. Nel 3.0 ci stiamo allontanando da questo, ad esempio cPickle è scomparso, così è cStringIO. ** Il linguaggio di implementazione dovrebbe non splendere attraverso **. \ * Forse \ * lo "stato predefinito" dovrebbe guidare la maiuscola , quindi solo i tipi predefiniti sono in minuscolo (str, int, dict ecc.) "* – dano

Problemi correlati