Python 如何重构此递归策略表达式策略以参数化其长度?

Python 如何重构此递归策略表达式策略以参数化其长度?,python,python-hypothesis,Python,Python Hypothesis,上下文 首先,谢谢你的假设。它既非常强大又非常有用 我已经编写了一个假设策略来生成以下形式的单调(ANDS和ORs)策略表达式: (A and (B or C)) 这可以看作是一种树结构,其中a、B和C是叶节点上的属性,而“and”和“or”是非叶节点 该策略似乎可以根据需要生成表达式 >>查找(policy_expressions(),lambda x:len(x.split())>3) “(A或(A或A))” (也许可以改进实例的统计多样性,但这不是这个问题的实质) 不平等也是有效的。例

上下文

首先,谢谢你的假设。它既非常强大又非常有用

我已经编写了一个假设策略来生成以下形式的单调(ANDS和ORs)策略表达式:

(A and (B or C))
这可以看作是一种树结构,其中a、B和C是叶节点上的属性,而“and”和“or”是非叶节点

该策略似乎可以根据需要生成表达式

>>查找(policy_expressions(),lambda x:len(x.split())>3)
“(A或(A或A))”
(也许可以改进实例的统计多样性,但这不是这个问题的实质)

不平等也是有效的。例如:

(N or (WlIorO and (nX <= 55516 and e)))
其中,
extract\u attributes()
计算表达式中的叶节点数,
n
是所需的叶数

此解决方案的问题在于,当
n
>16时,假设抛出一个:

hypothesis.errors.Unsatisfiable: Unable to satisfy assumptions of hypothesis test_keygen_encrypt_proxy_decrypt_decrypt_execution_time.
我想用100个叶节点生成有效的策略表达式

这种方法的另一个缺点是假设报告了
HealthCheck。过滤太多
HealthCheck。速度太慢
,设置变得丑陋

我更希望有一个参数表示
policy\u expressions(leaf\u nodes=4)
,以获得如下示例:

(N or (WlIorO and (nX <= 55516 and e)))

(N或(WlIorO)和(nX我建议明确地将叶数构建到数据的构造中,然后传入您想要的叶数:

来自假说。策略导入文本、复合、取样、字符、一个或多个整数
def策略表达式大小(num离开):
如果num_leave==1:
返回属性()
elif num_leaves==2:
返回一个(不等式(),策略表达式(num_leaves))
其他:
返回策略\u表达式(num\u leaves)
策略表达式=整数(最小值=1,最大值=500)。平面图(策略表达式大小为)
@复合材料
def policy_表达式(draw,num_leaves):
左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左
右叶=左叶数-左叶数
左=绘制(策略表达式大小(左左左)
右=绘制(策略表达式大小(右左))
门=绘制(门())
返回u'('+u'。连接((左,门,右))+u''
def属性():
返回文本(最小值=1,字母表=字符(白名单=L',最大值=0x7e))
@复合材料
def不平等(抽签):
attr=draw(attributes())
oper=draw(不等式\u运算符())
numb=绘图(整数(最小值=1))
返回u“”。加入((属性、操作、字符串(numb)))
def不等式u运算符():
从((u'',u'=')返回采样的\u
def gates():
从((u'or',u'and')返回样本
然后,您可以选择希望策略表达式的大小:

>>> policy_expressions.example()
'((((((oOjFo or (((cH and (Q or (uO > 18 and byy))) and kS) or pqKUUZ > 74)) and (gi or mwsrU <= 4115)) and qLkVSTqXZxgScTj) and (vNJ > 969 and (Drwvh or (((xhmsWhHpc or hQSMnfgyiYnblLFJ) or sesfHbQ) and jt)))) or xS) and ((V and (mArqYR or qY)) or (((uVf and bbtKUCnecMKjRJD > 18944) and nerVkPSs < 29292) and (UlOJebfbgcJz or (bxfVfjgmfulSB > 71 or (jqGLlr or (zQqj and zqUGwc < 24845)))))))'
>>> 
>>> policy_expressions_of_size(1).example()
'Eo'
>>> 
>>> policy_expressions_of_size(2).example()
'KJAitOKC > 18179'
>>> policy_expressions_of_size(10).example()
'(((htjdVy or (((XTfZil or (rqZw and DEOeER)) and xGVsdeQJLTJxLsC < 388312303) or LxLfUPljUTH)) or (Kb or EoipoYzjncAGKTE)) or bc)'
>>> policy_expressions_of_size(100).example()
'(((((CxySeUrNW or bZG) or (gzSUGgTG and (((V or n) or wqA) or veuTEnjGKwIpkDDDBiQkMwsNbxrBv))) or (((SKgQSXtAg or ChCHcEsVavy) and (((Yxj and xcCX) or QrILGAWxVKXWRb > 98817811688973569232860005374239659122) or JD <= 28510)) and KhrGfZciz > 4057857855522854443)) and (ZMIzFELKAKDMrH and (((MOmAZ and J <= 22052) or (Scy >= 17563 and (VCS and ((FFLa and EtZvqwNymnZNnjlREM) or pU)))) or A))) and ((((kaYzzIXIu and (lwos and (vp and GqG))) and ((Nh and lb) or ((TbNZWYOpYmj and (AQs or w)) or NjFYLBr > 228431293))) or ((((FTSXkXGZyKXD or zXeVEqNgkyXI) or mNGI) or ((cGOGK or gjcI) and DQzYonXszfSrZMB)) and JI > 3802)) or (((jIREd and IVzFB >= 28149) and (UdCBg < 20 or (VSGxr or XBuiS <= 1615))) and (rE > 10511139808015932 and ((((((((W and u) or yslVZ) or (eVGlz < 7033 or UiE)) and ((trOmArBc and Zx) or mPKva)) or ((qqDmKUpAnW or yvSkhTgqXQaLnxL) or Z)) or snXcMDhhf) and ((Wu or XSjbKdsZqEiXXvOb) and (DNZg and qv >= 7503))) and ((rnffxTLThwvw >= 24460 and ((oO or y <= 24926) and (NjM and vEHukii))) or ((((BTdpW and rP) or (rjUylCZwJzGobXZR or MNoBdEEIuLbTRvZHMb < 7958346708112664935)) and ((YU or gY >= 15498) and (s and GnOydthO > 103))) or ((caumKPjp < 27 and OQoFXscbD) or ((qaxYwfnelmetYqHKnatQ or P) and (ixzsvX and mYROpqoHAqeEy))))))))))'
>策略表达式。示例()
"((((()((oOjFo or((cH and(Q or(uO>18 and byy)and kS)or)(gi or mwsrU 969 and(Drwvh或(((xhmshwhhpc或hqmnfgyinbllfbq)and jt))and jt)kS)和xS))'
>>> 
>>>大小为(1)的策略表达式。示例()
“Eo”
>>> 
>>>大小为(2)的策略表达式。示例()
“Kjaitock>18179”
>>>大小为(10)的策略表达式。示例()
“((htjdVy或((XTfZil或(rqZw和DEOeER))和xGVsdeQJLTJxLsC<388312303)或LxLfUPljUTH))或(Kb或eoipoyzncakte))或bc)”
>>>大小为(100)的策略表达式。示例()
"(((CxySeUrNW或bZG)或(gzSUGgTG和((V或n)或wqA或veuTEnjGKwIpkDDDBiQkMwsNbxrBv))或((SKgQSXtAg或chcesvavy)和((Yxj和xcx)qrilgawxvkwrb>988178116889797335692328600537339659122)或JD 40578855522854443)))和)zmizfelkkdmrh和(V和(((kaYzzIXIu和(lwos和(vp和GqG))和((Nh和lb)或((TbNZWYOpYmj和(AQs或w))或NjFYLBr>228431293)))或(((FTSxKxxGzykxd或zXeVEqNgkyXI)或mNGI)或((cGOGK或gjcI)和DqzyonxSzfszfsrzmb)和JI>3802))或((jIREd和ZFIVB>=28149)和(UdCBg<20或(VSGxr或Xb105398015932和()或Lvz(()(eVGlz<7033或UiE)和((trOmArBc和Zx)或mPKva)或((qqDmKUpAnW或YVSKHTGQXQQALNXL)或Z)或snXcMDhhf)和((Wu或XSJBKDSQEIXVOB)和(DNZg和qv>=7503))和((rnffxTLThwvw>=24460和((oO或y=15498)和(s和GnOydthO>103))或((caumKPjp<27和OQOQOFXSCBD)或((QXYWFNEYKQHQHKYVX)和MYVX)))和(MYVX)和(QOQOQROPEY)))))))))'