recorrer - ¿Hay una descripción de cómo funciona__cmp__ para los objetos dict en Python 2?
recorrer diccionario python (3)
He estado tratando de hacer una subclase dict
UserDict.DictMixin
de UserDict.DictMixin
que admite claves no hashable. El rendimiento no es una preocupación. Desafortunadamente, Python implementa algunas de las funciones en DictMixin
al intentar crear un objeto dict desde la subclase. Puedo implementar esto yo mismo, pero estoy atascado en __cmp__
.
No puedo encontrar una descripción sucinta de la lógica utilizada por el __cmp__
para la clase dict.
Aquí hay una descripción de __cmp__
, pero creo que lo importante a tener en cuenta es que __cmp__
solo se usa si no se definen los métodos de "comparación rica", como __lt__
y __eq__
. Además, en Python3, __cmp__
se elimina del lenguaje. Entonces tal vez __cmp__
completo y simplemente defina __lt__
y __eq__
.
Si estás preguntando cómo funciona la comparación de diccionarios, es esto:
- Para comparar los dados A y B, primero compara sus longitudes. Si son desiguales, devuelva cmp (len (A), len (B)).
- A continuación, encuentre la clave adiff en A, que es la clave más pequeña para la que
adiff not in B or A[adiff] != B[adiff]
. (Si no existe tal clave, los dictados son iguales.) - También encuentre la clave más pequeña bdiff en B para la cual
bdiff not in A or A[bdiff] != B[bdiff]
. - Si adiff! = Bdiff, devuelva cmp (adiff, bdiff). De lo contrario, devuelva cmp (A [adiff], B [bdiff]).
En pseudocódigo:
def smallest_diff_key(A, B):
"""return the smallest key adiff in A such that adiff not in B or A[adiff] != B[bdiff]"""
diff_keys = [k for k in A if k not in B or A[k] != B[k]]
return min(diff_keys)
def dict_cmp(A, B):
if len(A) != len(B):
return cmp(len(A), len(B))
try:
adiff = smallest_diff_key(A, B)
except ValueError:
# No difference.
return 0
bdiff = smallest_diff_key(B, A)
if adiff != bdiff:
return cmp(adiff, bdiff)
return cmp(A[adiff], b[bdiff])
Esto se traduce de la implementación 2.6.3 en dictobject.c.
Una alternativa es usar Mapping ABC del paquete de collections . Está disponible en 2.6 y hasta Simplemente hereda de las colecciones. __contains__
e __iter__
métodos __getitem__
, __contains__
y __iter__
. Obtienes todo lo demás gratis.