小编典典

是否有关于__cmp__如何在Python 2中为dict对象工作的描述?

python

我一直在尝试使dict子类继承自UserDict.DictMixin支持非哈希键的子类。性能不是问题。不幸的是,PythonDictMixin通过尝试从子类创建dict对象来实现其中的某些功能。我可以自己实现这些功能,但是我仍然坚持__cmp__

我找不到__cmp__对dict类内置的逻辑的简要描述。


阅读 203

收藏
2021-01-20

共1个答案

小编典典

如果您要问比较字典的工作原理,是这样的:

  • 要比较字典A和B,首先比较它们的长度。如果它们不相等,则返回cmp(len(A),len(B))。
  • 接下来,找到A中的密钥adiff,它是的最小密钥adiff not in B or A[adiff] != B[adiff]。(如果没有这样的键,则字典是相等的。)
  • 还要找到B中最小的键bdiff bdiff not in A or A[bdiff] != B[bdiff]
  • 如果adiff!= bdiff,则返回cmp(adiff,bdiff)。否则返回cmp(A [adiff],B [bdiff])。

用伪代码:

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])

这是从dictobject.c中的2.6.3实现翻译而来的。

2021-01-20