regex 在跨多个系统和Python版本测试时,如何匹配包含Python无序集对象的字符串?

lnxxn5zx  于 2023-06-25  发布在  Python
关注(0)|答案(1)|浏览(80)

我有一个CI设置,它在Python版本>= 3.7以及Ubuntu和macOS系统上运行测试。我有一个测试,似乎随机失败,我想知道它是否与无序集如何存储在不同系统的内存中有关。该错误是一个失败,其中正确地引发了警告,但它与预期的警告消息不匹配,因为它显示的正则表达式模式与set对象的不同顺序打印在一起。我想知道是否有更好的方法来比较无序集,当它们作为对象插入到f字符串正则表达式中时。
为了清楚起见,我测试了以下函数:

def check_items(item):
    my_set = {True, False, "item1", "item2", "item3"}
    if item not in my_set:
        raise ValueError(
            f"Parameter reorder needs to be one of {my_set}."
        )
    return item

在一个单独的测试文件中,我有以下测试

import pytest

my_set = {True, False, "item1", "item2", "item3"}

def test_check_items_error():
    with pytest.raises(
            ValueError,
            match=f"Parameter reorder needs to be one of {my_set}"
    ):
        check_items("new")

测试失败的原因是

AssertionError: Regex pattern did not match.
 Regex: "Parameter reorder needs to be one of {False, True, 'item1', 'item2', 'item3'}"
 Input: "Parameter reorder needs to be one of {False, True, 'item2', 'item1', 'item3'}."

什么是最安全的方法来确保相同的无序集在这个设置中正确匹配,它们被插入到f字符串中?

vbopmzt1

vbopmzt11#

我们可以通过对每个set元素的repr进行排序来“规范化”set。这样,结果将按顺序排列:

#!/usr/bin/env python3
import pytest

def check_items(item):
    my_set = {True, False, "item1", "item2", "item3"}
    if item not in my_set:
        normalized = ", ".join(sorted(repr(e) for e in my_set))
        raise ValueError(f"Parameter reorder needs to be one of {normalized}.")
    return item



def test_check_items_error():
    my_set = {"item1", "item2", "item3", False, True}
    normalized = ", ".join(sorted(repr(e) for e in my_set))
    with pytest.raises(
        ValueError, match=f"Parameter reorder needs to be one of {normalized}"
    ):
        check_items("new")

在这种情况下,无论你如何订购你的一套,消息将出来是

Parameter reorder needs to be one of 'item1', 'item2', 'item3', False, True.

相关问题