kwargs.copy()的插入顺序现在也应该被认为是有保障的吗? (发布Python 3.6)

时间:2017-05-24 15:03:08

标签: python python-3.6

关键字参数的插入顺序现在是3.6版Python中的guaranteed to be preserved。通过更改dict对象的基础表示,可以实现这一点。

但是,已经声明 - somewhat strenuously - 一般来说,dict对象的订单保存一般不应该依赖。文档用这种方式解释了这种情况:

  

考虑了这个新实现的顺序保留方面   一个实施细节,不应该依赖(这可能   未来的变化,但希望有这个新的词典   在更改之前,在几种版本的语言中实现   语言规范要求所有当前的命令保留语义   和未来的Python实现;这也有助于保存   向后兼容旧版本的语言   随机迭代顺序仍然有效,例如, Python 3.5)。

PEP 468没有提及复制关键字参数的任何内容。但有时人们可能希望迭代kwargs个参数的副本(例如,在for循环中变异kwargs时):

def i_will_never_fail(**kwargs):
    for thing1,thing2 in zip(kwargs.copy(), kwargs):
        assert thing1==thing2

我的问题是:kwargs.copy()产生的对象的顺序是否也应该被保证?或者这也应该被视为实施细节?是OrderedDict only mostly dead吗?

1 个答案:

答案 0 :(得分:1)

答案取决于实施。

假设非常受欢迎的CPython,答案是肯定的。正如您在dictobject.c代码中的PyDict_Copy函数(第2615行)中所看到的,随着值的增加引用,该函数开始使用该片进行复制

split_copy->ma_keys = mp->ma_keys;

这一点,在为mp分配了一个dicitionary对象之后(或者更确切地说,是将原始dict明确地转换为PyDictObject)。

由于密钥保留了它们的顺序,并且考虑到当前的存储形式(如Jim's explanation here中所示),因此生成的字典应该以相同的方式排序。

  

同样,这当前被认为是实施细节,您应该使您的任何代码依赖它。