2011-07-06 13 views
12

Después de leer this question, me di cuenta de que a S. Lott podría haberle gustado usar un "orden predeterminado", pero no existe. Ahora, me pregunto: ¿por qué tenemos tantas clases dict en Python?¿Por qué no se unifican los dictados de Python?

  • dict
  • blist.sorteddict
  • collections.OrderedDict
  • collections.defaultdict
  • weakref.WeakKeyDictionary
  • weakref.WeakValueDictionary
  • otros?

Por qué no tener algo como esto,

dict(initializer=[], sorted=False, ordered=False, default=None, 
    weak_keys=False, weak_values=False) 

que unifica todo, y ofrece todas las combinaciones útil?

+0

¿Qué ocurre cuando usas 'a = {}'? – GWW

+2

'{}' ¿debería construir un dict regular de forma predeterminada? –

+0

Creo que significa, para llegar a las otras formas de dict utilizamos la inicialización 'dict()' que describió –

Respuesta

11

Un problema es que hacer este cambio se rompería la compatibilidad hacia atrás, debido a este tipo de uso del constructor que existe ahora:

>>> dict(one=1, two=2) 
{'two': 2, 'one': 1} 
+0

Buen punto. Me olvide de eso. –

+0

No creo que esta sea una buena razón. Si tener una sola clase 'dict' fuera una buena idea, aparte de la compatibilidad con versiones anteriores, se habría propuesto para Python 3. – RoundTower

7

Esas opciones adicionales no son gratis. Dado que el 99,9% de Python se basa en dict, es muy importante para que sea lo mínimo y lo más rápido posible.

+1

No se puede '__new__' ser anulado para que el constructor de' dict' devuelve la clase regular y liviana 'dict' si todas las otras opciones son' False'/'None'? –

+0

¿Con qué frecuencia las otras opciones probablemente * no * sean 'False' /' None'? –

+1

El problema es que con un problema como el problema vinculado, son las combinaciones (como el orden predeterminado) que desea que no están disponibles en absoluto. Además, yo no sabía nada de todas estas otras predice cuando empecé a aprender Python, y que habría sido mucho más fácil de encontrar como opciones para el dict estándar en lugar de escondido en las bibliotecas que he tenido que averiguar acerca. –

4

Porque las implementaciones difieren mucho. Es, básicamente, iba a terminar con una fábrica dict que devuelve una instancia de un _dict (Un diccionario muy rápido, de baja sobrecarga - la corriente dict), ordereddict, defaultdict, ... clase. Además, ya no se podían inicializar diccionarios con argumentos de palabra clave; programas que dependen de este fracasarían:

>>> dict(sorted=42) 
{'sorted': 42} 
# Your proposal would lead to an empty dictionary here (breaking compatibility) 

Además, cuando es razonable, las diversas clases ya se heredan entre sí:

>>> collections.defaultdict.__bases__ 
(<type 'dict'>,) 
0

Es por eso que los idiomas tienen "mixins".

Puede intentar inventar algo como lo siguiente definiendo el grupo correcto de clases.

class defaultdict(dict, unordered, default_init): pass 
class OrderedDict(dict, ordered, nodefault_init): pass 
class WeakKeyDict(dict, ordered, nodefault_init, weakkey): pass 
class KeyValueDict(dict, ordered, nodefault_init, weakvalue): pass 

Entonces, una vez que tenga los diccionarios "unificadas", las aplicaciones de este aspecto

groups= defaultdict(list) 

Ningún cambio real para la aplicación, ¿verdad?

Cuestiones relacionadas