- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
上下文
首先,感谢您的假设。它既非常强大又非常有用!
我编写了一个假设策略来生成以下形式的单调(ANDS 和 OR)策略表达式:
(A and (B or C))
这可以被认为是一个树结构,其中 A、B 和 C 是叶子节点的属性,而 'and' 和 'or' 是非叶子节点。
该策略似乎可以根据需要生成表达式。
>>> find(policy_expressions(), lambda x: len(x.split()) > 3)
'(A or (A or A))'
(也许可以提高样本的统计多样性,但这不是这个问题的本质)。
不等式也是有效的。例如:
(N or (WlIorO and (nX <= 55516 and e)))
我想约束或过滤示例,以便生成具有指定数量的叶节点(即属性)的策略表达式。
对于性能测试,我试过将 data.draw()
与 filter
一起使用,如下所示:
@given(data=data())
def test_keygen_encrypt_proxy_decrypt_decrypt_execution_time(data, n):
"""
:param n: the input size n. Number of attributes or leaf nodes in policy tree.
"""
policy_str = data.draw(strategy=policy_expressions().filter(lambda x: len(extract_attributes(group, x)) == n),
label="policy string")
其中 extract_attributes()
计算表达式中叶节点的数量,n
是所需的叶节点数。
这个解决方案的问题在于,当 n
> 16 时,假设会抛出一个:
hypothesis.errors.Unsatisfiable: Unable to satisfy assumptions of hypothesis test_keygen_encrypt_proxy_decrypt_decrypt_execution_time.
我想生成具有 100 个叶节点的有效策略表达式。
该方法的另一个缺点是假设报告 HealthCheck.filter_too_much
和 HealthCheck.too_slow
并且 @settings
变得丑陋。
我宁愿有一个参数说 policy_expressions(leaf_nodes=4)
来得到这样的例子:
(N or (WlIorO and (nX <= 55516 and e)))
我最初避免了这种情况,因为我看不到如何使用递归策略代码来做到这一点。
问题
您能否建议一种重构此策略的方法,以便它可以针对叶节点的数量进行参数化?
这是策略代码(无论如何它在 Charm Crypto 中是开源的)
from hypothesis.strategies import text, composite, sampled_from, characters, one_of, integers
def policy_expressions():
return one_of(attributes(), inequalities(), policy_expression())
@composite
def policy_expression(draw):
left = draw(policy_expressions())
right = draw(policy_expressions())
gate = draw(gates())
return u'(' + u' '.join((left, gate, right)) + u')'
def attributes():
return text(min_size=1, alphabet=characters(whitelist_categories='L', max_codepoint=0x7e))
@composite
def inequalities(draw):
attr = draw(attributes())
oper = draw(inequality_operators())
numb = draw(integers(min_value=1))
return u' '.join((attr, oper, str(numb)))
def inequality_operators():
return sampled_from((u'<', u'>', u'<=', u'>='))
def gates():
return sampled_from((u'or', u'and'))
def assert_valid(policy_expression):
assert policy_expression # not empty
assert policy_expression.count(u'(') == policy_expression.count(u')')
https://github.com/JHUISI/charm/blob/dev/charm/toolbox/policy_expression_spec.py
最佳答案
我建议明确地将叶数构建到数据的构建方式中,然后传入您想要的叶数:
from hypothesis.strategies import text, composite, sampled_from, characters, one_of, integers
def policy_expressions_of_size(num_leaves):
if num_leaves == 1:
return attributes()
elif num_leaves == 2:
return one_of(inequalities(), policy_expression(num_leaves))
else:
return policy_expression(num_leaves)
policy_expressions = integers(min_value=1, max_value=500).flatmap(policy_expressions_of_size)
@composite
def policy_expression(draw, num_leaves):
left_leaves = draw(integers(min_value=1, max_value=num_leaves - 1))
right_leaves = num_leaves - left_leaves
left = draw(policy_expressions_of_size(left_leaves))
right = draw(policy_expressions_of_size(right_leaves))
gate = draw(gates())
return u'(' + u' '.join((left, gate, right)) + u')'
def attributes():
return text(min_size=1, alphabet=characters(whitelist_categories='L', max_codepoint=0x7e))
@composite
def inequalities(draw):
attr = draw(attributes())
oper = draw(inequality_operators())
numb = draw(integers(min_value=1))
return u' '.join((attr, oper, str(numb)))
def inequality_operators():
return sampled_from((u'<', u'>', u'<=', u'>='))
def gates():
return sampled_from((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))))))))))'
关于python - 我如何重构这个递归策略表达式 Strategy 来参数化它的长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55498549/
是否有任何特定于 CoffeeScript 的技巧可以使这看起来更整洁: index = (-> if segment == 'index' return
我正在试验 C# 的不同领域并重构最佳实践/模式。 可以看出,下面的 Validate 方法有 3 个子验证方法。 有没有办法重新设计/重构此方法,以便删除 if 语句? (可能使用委托(delega
我正在制作一个简单的 Rails 站点,它将存储一些日期并执行基本的条件检查。我在下面写了一些方法,并被告知我可以使它们更有效率。我一直挠头,我不知道该怎么做。我应该让 entry.find 全局化吗
有没有更好的方法来编写这个函数?我继承了一些 javascript 代码,如果可能的话,我想让它更简洁。此外,我可能会添加更多“主题”元素,并且不想一遍又一遍地复制和粘贴。 function imag
1. 效果展示 在线查看 2. 开始前说明 效果实现参考源码: Logo 聚集与散开 原效果代码基于 react jsx 类组件实现。依赖旧,代码冗余。
我似乎缺乏足够的咖啡来让我清楚地看到以下问题。 假设我有一个包含两个构造函数和多个字段的类。一个构造函数是无参数构造函数,一个字段依赖于另一个字段。另一个构造函数为其其中一个字段获取注入(inject
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a min
我有一个枚举,里面有一些状态: enum State { A, B, C, D } 以及具有相应状态的对象: class MyObject { State st
我的 build.xml 中有这段代码:
在Delphi XE中,我经常使用重命名变量重构(Ctrl+Shift+E),通过给出更有意义的变量名称来使我的代码更容易理解,例如: 这一切都很好,但是当我使用它时,我在工作空间方面遇到了一个小问题
我实现了一个逻辑来通过data变量计算剩余数量和成本。它循环遍历每个产品,并通过计算已返回数量状态的数量来计算剩余数量,并减去产品数量。 有没有办法重构这段代码,使其看起来更干净、易于理解/可维护?我
我正在学习 Haskell,所以这可能是一些非常微不足道的事情,但我希望得到一些关于如何重写它以及它如何工作的指示。 我有以下工作代码(使用的包: HTF 、 Parsec 和 Flow ): {-#
我有以下代码: switch(equipmentAttachment.AttachmentPosition) { case 'AttachFront': { if(
我正在尝试将代码从 Java Utility Logging 更改为 Log4J2。要更改代码,我想在 Eclipse 中使用代码重构。例如更改:导入 java.util.logging.Logger
我有一个处理 Excel 文件中的行的函数。在这个函数中,我有一个 for 循环。现在,一旦提取一行,我们就会检查各种条件。如果任何条件为假,我们继续下一步row.可以使用模式使这段代码更加结构化吗?
我正在重构一个有很多嵌套调用的程序,例如 ServiceManagement.getGlobalizationService() .createExportCo
我在 JTabbedPane 上重构了许多字段以减少冗余。但是,当我为字段数量设置常量大小时,出现空指针异常。我不太确定为什么会发生这种情况。我做错了什么,更重要的是有人可以解释发生了什么事吗? pu
我试图通过删除 map.setOnPolygonClickListener 和 map.setOnMarkerClickListener 中的重复项来重构以下方法。 两个监听器执行完全相同的操作,我想
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 6 年前。 Improve this ques
当我在这张照片中重构 Storyboard时 link . 我找不到在哪里可以交换标签栏项目的位置。 例如,我想将主菜单更改为索引 0。 这是我的storyboard . 最佳答案 您可以通过拖放标签
我是一名优秀的程序员,十分优秀!