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

Dan*_*ung 21 python python-2.x

我一直在尝试创建一个dict继承的子类,UserDict.DictMixin它支持不可散列的密钥.性能不是问题.不幸的是,Python DictMixin通过尝试从子类创建一个dict对象来实现一些功能.我自己可以实现这些,但我坚持下去__cmp__.

我找不到__cmp__dict类内置使用的逻辑的简洁描述.

Ned*_*der 31

如果你问的是如何比较词典,它是这样的:

  • 要比较字母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])
Run Code Online (Sandbox Code Playgroud)

这是从dictobject.c中的2.6.3实现转换而来的.

  • 您是否知道通过阅读`dict_compare`(http://svn.python.org/projects/python/trunk/Objects/dictobject.c)的来源或是否在某处记录了? (2认同)