Pytest:使用假设生成总和为 1 的浮点数列表

Posted

技术标签:

【中文标题】Pytest:使用假设生成总和为 1 的浮点数列表【英文标题】:Pytest: generating list of floats summing up to 1 with hypothesis 【发布时间】:2021-01-09 17:40:42 【问题描述】:

对于单元测试,我想使用hypothesis 库生成floatlist。有一些重要的限制:

    列表中的成分数量必须大于 1 且小于 15 最小值必须大于 0 最大值必须小于 1 所有成分的总和必须完全等于一 (1)

到目前为止,我能够满足前三个约束。

@given(
    strategies.lists(
        st.floats(min_value=0, max_value=1, exclude_min=True, exclude_max=True),
        min_size=2,
        max_size=15,
    )
)

我怎样才能满足第四个约束?

【问题讨论】:

【参考方案1】:

我认为您不能直接添加约束,但您可以调整数据以使其满足条件,例如:

def normalize(float_list):
    s = sum(float_list)
    return [f / s for f in float_list]


@given(
    strategies.lists(
        st.floats(min_value=0, max_value=1, exclude_min=True,
                  exclude_max=True),
        min_size=2,
        max_size=15,
    ).map(normalize)
)
def test_sum(f):
    assert abs(sum(f) - 1) < 0.0000001

例如您自己对结果列表进行规范化,以便它通过条件。 请注意,这可能不会为您提供正好为 1 的数字(由于浮点数精度)。此外,假设可能会选择一些边缘情况(比如一些非常小的数字),这些情况在映射后可能不是边缘情况——这对您来说可能是也可能不是问题。

【讨论】:

以上是关于Pytest:使用假设生成总和为 1 的浮点数列表的主要内容,如果未能解决你的问题,请参考以下文章

python使用列表推导式(list comprehension)和itertools生成浮点数列表

“表达式不可分配”——将浮点数分配为 Xcode 中其他两个浮点数的总和时出现问题?

将字符串浮点数列表转换为具有 2 个小数点的浮点数列表

生成一个二进制数列表,其中 n 位设置为 1

在浮点数列表中查找 NaN 并将上一个和下一个元素设置为 NaN

如何在 Python 中将浮点数列表输出到二进制文件