通过另一种策略引用一种策略

Referencing one strategy through another

定义策略时,是否可以引用其他策略?

@given(maximum=strategies.floats(min_value=0),
       actual=strategies.floats(max_value=maximum))
def foo(maximum, actual):
    pass

这会抛出 NameError: 'maximum' not defined'

编辑:

一种解决方法(或者可能是 解决方法)是使用假设的 assume 函数。就我而言,它看起来像:

@given(maximum=strategies.floats(min_value=0),
       actual=strategies.floats(min_value=0))
def foo(maximum, actual):
    assume(actual <= maximum)
    pass

您的选项可以概括为 "do it by rejecting some examples"(.filter()assume(),或 "do it by construction"。

后者通常效率更高,但可能需要更多代码。如果您 do 想尝试通过构造来满足您的约束,您将需要编写一个 @st.composite 策略来提供多个参数作为元组;或者一直到 st.data() 策略并在测试中交互式绘制。

或者...在这种简单的情况下,您可以将 if actual > maximum: actual, maximum = maximum, actual 放在测试函数的顶部。