Python @复杂策略中的复合图与平面图

Python @复杂策略中的复合图与平面图,python,property-based-testing,python-hypothesis,Python,Property Based Testing,Python Hypothesis,假设允许两种不同的方式来定义衍生策略,@composite和flatmap。据我所知,前者能做后者能做的任何事情。然而,numpy阵列策略的核心是一些隐藏的成本 #为了方便起见,我们支持将策略作为参数传递,或者至少 #出于遗留原因,但不想支付复合材料的性能成本 #策略(即重复的论点处理和验证),如果不是 #需要。因此,我们通过使用flatmap进行递归来获得这两个方面的最佳效果, #但只有在真正需要的时候。 我认为这意味着更糟糕的收缩行为,但我不确定,而且我在其他地方也找不到记录。那么,我应该

假设允许两种不同的方式来定义衍生策略,
@composite
flatmap
。据我所知,前者能做后者能做的任何事情。然而,numpy
阵列
策略的核心是一些隐藏的成本

#为了方便起见,我们支持将策略作为参数传递,或者至少
#出于遗留原因,但不想支付复合材料的性能成本
#策略(即重复的论点处理和验证),如果不是
#需要。因此,我们通过使用flatmap进行递归来获得这两个方面的最佳效果,
#但只有在真正需要的时候。

我认为这意味着更糟糕的收缩行为,但我不确定,而且我在其他地方也找不到记录。那么,我应该在什么时候使用
@composite
,什么时候使用
flatmap
,以及什么时候应该像上面链接的实现那样走这条中间路线?

@composite
。flatmap
确实是完全等效的——你可以对其中一个做任何事情,你也可以对另一个做任何事情,它也将具有相同的性能

实际上,我写了这篇评论,原因是我们只是有时候想使用平面图/合成图,但总是想仔细验证我们的逻辑。按照我的设置方式,通过使用
.flatmap
,我们可以避免多次调用验证器-如果我们想使用
@composite
,这将需要第二个函数定义


(还有一个API风格的问题,即这些参数几乎总是值,但有时可能是策略。我们现在主要基于
arrays()
造成的混乱来禁止此类API,以支持让用户编写自己的
。flatmap
s)

是有意义的。你能解释一下“验证器”是什么意思吗?在文档中搜索
validator
,只会产生两次点击,这两次点击都不能真正解释任何事情。不将策略作为参数,而是将其作为
.flatmap
所有参数,这是公认的最佳实践吗?在内部,我们检查所有参数是否都是允许的类型-但很明显,一旦验证程序通过一次,我们就不必为每个示例再次运行它。最佳实践是,任何特定的参数都可以接受值xor策略。例如,在
st.datetimes()
中,
min\u值必须始终是datetime(决不是策略),
时区必须始终是
tzinfo
对象(决不是这样的对象)的策略。根据频率和比较
st.just(…)
vs
x.flatmap(…)
的不便程度来决定使用哪一种。