【问题标题】:Python Hypothesis: How to compose generators that are dependent on each other?Python 假设:如何组成相互依赖的生成器?
【发布时间】:2017-03-22 04:00:40
【问题描述】:

我有一个使用 python 假设的生成器,如下所示:

@st.composite
def generate_network_fault_only(draw):
    fault = {
        "impaired": st.just(True),   # need to detect if all faults are None to switch this back.
        "limit": draw(NetworkFaultGen.generate_limit()),
        "delay": draw(NetworkFaultGen.generate_delay()),
        "loss_random": draw(NetworkFaultGen.generate_loss_random()),
        "corrupt": draw(NetworkFaultGen.generate_corrupt()),
        "duplicate": draw(NetworkFaultGen.generate_duplicate()),
        "reorder": draw(NetworkFaultGen.generate_reorder()),
        "rate": draw(NetworkFaultGen.generate_rate())
    }

    return draw(st.fixed_dictionaries(fault))

上面的每个函数都返回如下内容:

@st.composite
def generate_reorder(draw):
    """
    This must only happen if delay is applied
    """
    return st.one_of(st.fixed_dictionaries(
              {"percent": st.integers(min_value=0, max_value=100),
               "correlation": st.integers(min_value=0, max_value=100),
               "distance": st.integers(min_value=0)}),st.none())

我在 reorder 值和 delay 值之间存在依赖关系,只有在延迟不是 None 时才能指定重新排序。

我不知道如何做到这一点。过滤似乎遇到了性能问题。而此时代码中的delay 值还不是具体值。

【问题讨论】:

    标签: python python-hypothesis


    【解决方案1】:

    如果您希望每个示例仅在全局范围内指定一次延迟(即每次给定调用您的测试函数时固定为单个值,但不同调用之间可能不同),您可以使用 shared 来做到这一点? https://hypothesis.readthedocs.io/en/latest/data.html#hypothesis.strategies.shared

    即如果您执行 delay = shared(my_base_strategy, key='network.delay') 之类的操作,则所有其他依赖于延迟的策略都可以从中提取并获得一个一致的值。

    【讨论】:

      【解决方案2】:

      我在reorder 值和delay 值之间存在依赖关系,因为只有在delay 不是None 时才能指定reorder。我不确定如何做到这一点。

      在您的复合策略中,仅当存在delay 时,您才可以有条件地指定reorder

      @composite
      def generate_network_fault_only(draw):
        fault = {
             "impaired": st.just(True),  
              "limit": draw(NetworkFaultGen.generate_limit()),
              "delay": draw(NetworkFaultGen.generate_delay()),
              "loss_random": draw(NetworkFaultGen.generate_loss_random()),
              "corrupt": draw(NetworkFaultGen.generate_corrupt()),
              "duplicate": draw(NetworkFaultGen.generate_duplicate()),
              "rate": draw(NetworkFaultGen.generate_rate())
        }
      
        if fault['delay']:
          fault['reorder'] = draw(generate_reorder())
        return fault
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-18
        • 1970-01-01
        • 1970-01-01
        • 2012-10-29
        • 2013-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多