为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

蝴蝶刀刀 2019-12-03 16:25:51
我一直在尝试使dict继承自UserDict.DictMixin支持非哈希键的子类。性能不是问题。不幸的是,Python DictMixin通过尝试从子类创建dict对象来实现其中的某些功能。我可以自己实现这些功能,但是我仍然坚持__cmp__。我找不到__cmp__对dict类内置的逻辑的简要描述。
查看完整描述

3 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

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


要比较字典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实现翻译而来的。


查看完整回答
反对 回复 2019-12-03
?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

还有的描述__cmp__ 在这里,但我觉得需要注意的重要一点是,__cmp__如果“富比”的方法,如仅使用__lt__和__eq__没有定义。此外,在Python3中,__cmp__该语言已被删除。因此,也许__cmp__完全避开而只是定义__lt__和__eq__。


查看完整回答
反对 回复 2019-12-03
  • 3 回答
  • 0 关注
  • 499 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信