当前位置: 首页 > 知识库问答 >
问题:

Pytest dict等式保持顺序和nice diff输出(python-3.7)

姚棋
2023-03-14

从python 3.7开始,确保插入顺序。我有一个单元测试使用pytest,我想比较两个迪克斯,但考虑到元素的顺序。

我的应用程序永远不会在比3.7旧的python上运行,所以向后兼容性对我来说不是问题。

问题

有没有可能比较常规的判决s,保持秩序和漂亮的diff输出pytest?

我失败的尝试

a = {'x': 1, 'y': {'u': 3, 'v': 4}}
b = {'y': {'v': 4, 'u': 3}, 'x': 1}

assert a == b

这个断言通过了,但我不希望它通过。这些格言是相等的,但顺序不对。

我可以将所有内容转换为OrderedDict,但它是

  • 丑陋代码
  • 产生丑陋的pytest diff输出
from collections import OrderedDict

def deep_ordered_dict(value):
    if isinstance(value, dict):
        value = OrderedDict(value)

        for k, v in value.items():
            value[k] = deep_ordered_dict(v)

    if isinstance(value, list):
        for k, v in enumerate(value):
            value[k] = deep_ordered_dict(v)

    return value

a = {'x': 1, 'y': {'u': 3, 'v': 4}}
b = {'y': {'v': 4, 'u': 3}, 'x': 1}

assert deep_ordered_dict(a) == deep_ordered_dict(b)

把它比作JSON不是更好

  • 产生测试差异输出
import json

a = {'x': 1, 'y': {'u': 3, 'v': 4}}
b = {'y': {'v': 4, 'u': 3}, 'x': 1}

assert json.dumps(a, indent=2) == json.dumps(b, indent=2)

共有1个答案

东方乐
2023-03-14

尽管从Python3.7开始需要字典来保持插入顺序,但对于向后兼容性,相等比较是顺序独立的。这是dictOrderedDict之间的差异之一,因此,如果您希望进行订单敏感比较,应使用后者。

 类似资料:
  • 问题内容: 我正在尝试创建一个OrderedDict对象,但我不会立即创建它,否则所有元素都会混乱。 这是我的工作: 元素不按我分配的顺序排列 docs.python.org没有示例,我无法弄清楚订单为何变得混乱。任何帮助是极大的赞赏。 问题答案: 您的问题是,您正在构造一个将初始数据提供给的-这 不会 存储任何订单,因此订单在到达之前就丢失了。 解决方案是从有序数据类型构建-最简单的是的: 值得

  • 我正在使用XSLT将包含复杂数据结构、自由文本等的xml文档转换为HTML文档。我处理的文档可以包含或不包含结构项,如果存在结构标记,则可以任意嵌套。数据标记可以引用任何类型的商品,因此我事先不知道XML文档的内容。 文件看起来像 desiderata HTML文档应类似于: 事实上,我不知道这是否是一个好的解决方案,但是因为我不知道我的xml是否包含结构标签,所以我使用了一个“开关”来在两个主模

  • 包含由管道分隔的数字列表的文件可以有重复项。需要编写map reduce程序,在原始输入顺序中列出不重复的数字。我可以删除重复项,但不保留输入顺序。

  • 问题内容: 我想将一个键,值对添加到哈希表(或任何其他集合)中,但必须保持插入顺序。我怎样才能做到这一点? 就像我将1作为键“ 1”添加为值,将2作为键并将“ 2”添加为值。 输出应为: 问题答案: 以下是一些重要实现的特征差异: :“具有可预测的迭代顺序,通常是将键插入映射 的顺序 ( 插入顺序 )。” :“不保证地图的顺序” :“根据其键的自然顺序或按” 即是一个 因此,在这种情况下,您需要的

  • 问题内容: 是否可以保留“ IN”条件子句的顺序? 我在SO上发现了这个问题,但在他的示例中,OP已经有一个排序的“ IN”子句。 我的情况不同,’IN’子句的顺序是随机的: 我想按(45,2,445,12,789)顺序检索结果。我正在使用Oracle数据库。也许SQL中有一个属性,我可以将其与条件子句一起使用以指定保持子句的顺序。 问题答案: 除非您使用ORDER BY子句..否则不会有可靠的排

  • 我已经讨论了一些相关问题,比如如何确保java8流中的处理顺序?,我仍然不完全清楚输出元素的顺序。因此,请澄清我的以下疑问。 我认为至少在理论上(或根据java规范),它可以按1、2、3、4、5、6、7、8以外的随机顺序打印。我说得对吗? 还有一个相关的问题——遭遇订单保存的决定是在执行的哪个点做出的?更准确地说,在执行开始之前,是否通过检查源、中间操作和终端操作的特性来评估整个流水线的订单特性?