主要思想是使用strategies.slices
然后根据它们选择项目
from collections import abc
from typing import TypeVar
from hypothesis import strategies
from hypothesis.strategies import SearchStrategy
Sequence = TypeVar('Sequence', bound=abc.Sequence)
def subsequences(sequence: Sequence) -> SearchStrategy[Sequence]:
return strategies.builds(sequence.__getitem__,
strategies.slices(max(len(sequence), 1)))
它非常简短、直接,应该适用于任何支持切片的序列,如list
s、tuple
s 和str
ings(即使对于range
s,这是很棒的 IMO)。
例子:
>>> elements = list(range(5))
>>> sub_elements = subsequences(elements)
[1, 3]
>>> sub_elements.example()
[4]
>>> sub_elements.example()
[0, 2, 4]
该方法的唯一问题是我们无法创建所有可能的子序列(例如[0, 1, 4]
来自elements
OP)。
可以用strategies.permutations
like解决
from operator import getitem
from typing import (List,
Sequence,
TypeVar)
from hypothesis import strategies
from hypothesis.strategies import SearchStrategy
Element = TypeVar('Element')
def sub_lists(sequence: Sequence[Element]) -> SearchStrategy[List[Element]]:
return strategies.builds(getitem,
strategies.permutations(sequence),
strategies.slices(max(len(sequence), 1)))
但我们失去了原始序列类型。