Я обнаружил, что если мне нужно контролировать содержимое в структуре существующей стратегии (например, пары идентичных значений в массиве), мне нужно пропустить эту стратегию для более низких уровней с помощью которого я могу создать «готовое» значение, которое может заполнить тип, который мне нужен для генерации.
Давайте использовать, что numpy .array принимает список списков для создания массива. Предположим также, что вы хотите, чтобы каждая строка была уникальной, поскольку в вашем примере не показаны повторяющиеся строки. Если это нежелательно, удалите unique_by=str
из определения depth_strategy
- Создайте целое число и создайте список с этим значением, повторяющимся несколько раз, чтобы соответствовать ШИРИНЕ.
- Создайте список длины ГЛУБИНЫ из тех списков, которые мы создали на первом шаге.
- Объедините две стратегии, вложив их.
- Введите результат третьего шага в numpy .array, убедившись, что dtype соответствует стратегии, использованной для генерации значений на первом шаге.
# %%
"""Hypothesis strategy for array of tuples with pairs of identical values."""
from hypothesis import given, settings, strategies as st
import numpy as np
WIDTH = 2
DEPTH = 4
MIN_VALUE = -10
MAX_VALUE = 10
# Build the row - Here for clarification only
width_strategy = st.integers(MIN_VALUE, MAX_VALUE).map(
lambda i: tuple(i for _ in range(WIDTH))
)
# Build the array of rows - Here for clarification only
depth_strategy = st.lists(
width_strategy, min_size=DEPTH, max_size=DEPTH, unique_by=str
).map(lambda lot: np.array(lot, dtype=np.int64))
# All-in-One
complete_strategy = st.lists(
st.integers(MIN_VALUE, MAX_VALUE).map(
lambda i: tuple(i for _ in range(WIDTH))
),
min_size=DEPTH,
max_size=DEPTH,
unique_by=str,
).map(lambda lot: np.array(lot, dtype=np.int64))
@settings(max_examples=10)
@given(an_array=complete_strategy)
def create_numpy_array(an_array):
"""Turn list of lists into numpy array."""
print(f"A numpy array could be:\n{an_array}")
create_numpy_array()
Это генерирует что-то вроде:
A numpy array could be:
[[ 3 3]
[ 9 9]
[-5 -5]
[ 0 0]]
A numpy array could be:
[[ 3 3]
[-2 -2]
[ 4 4]
[-5 -5]]
A numpy array could be:
[[ 7 7]
[ 0 0]
[-2 -2]
[-1 -1]]
Обратите внимание, что I установите max_examples равным 10, поскольку гипотеза дает более высокий коэффициент вхождения к значениям, которые она считает «проблемными», например, ноль, NaN, бесконечность и тому подобное. Таким образом, example () или меньшее количество примеров, вероятно, сгенерирует множество массивов 2x4 со всеми нулями. К счастью, нам помогает ограничение unique_by.