Создать список диктов с одинаковыми ключами - PullRequest
0 голосов
/ 18 мая 2019

Я хочу создать список диктов, в которых все диктовки имеют одинаковый набор ключей.

import json
import hypothesis
from hypothesis import strategies as st


@st.composite
def list_of_dicts_with_keys_matching(draw,dicts=st.dictionaries(st.text(), st.text())):
    mapping = draw(dicts)

    return st.lists(st.fixed_dictionaries(mapping))

@hypothesis.given(list_of_dicts_with_keys_matching())
def test_simple_json_strategy(obj):
    dumped = json.dumps(obj)
    assert isinstance(obj, list)
    assert json.dumps(json.loads(dumped)) == dumped

TypeError: Объект типа LazyStrategy не поддерживает сериализацию JSON

Как я могу это исправить?

Редактировать: Вторая попытка:

import string

import pytest
import hypothesis
import hypothesis.strategies as st


@st.composite
def list_of_dicts_with_keys_matching(draw, keys=st.text(), values=st.text()):
    shared_keys = draw(st.lists(keys, min_size=3))
    return draw(st.lists(st.dictionaries(st.sampled_from(shared_keys), values, min_size=1)))


@hypothesis.given(list_of_dicts_with_keys_matching())
def test_shared_keys(dicts):
    assert len({frozenset(d.keys()) for d in dicts}) in [0, 1]


# Falsifying example: test_shared_keys(dicts=[{'': ''}, {'0': ''}])

1 Ответ

0 голосов
/ 20 мая 2019

Вы пропускаете draw(...) в return draw(st.lists(st.fixed_dictionaries(mapping))).

Однако это приведет вас ко второй проблеме - st.fixed_dictionaries использует отображение ключей для стратегий для значений , но mapping здесь будет Dict[str, str].Возможно:

@st.composite
def list_of_dicts_with_keys_matching(draw, keys=st.text(), values=st.text()):
    shared_keys = draw(st.lists(keys, min_size=3))
    return draw(st.lists(st.dictionaries(st.sampled_from(shared_keys), values)))

Обновление: приведенный выше фрагмент будет рисовать различные ключи из общего набора.Для идентичных ключей для всех диктов я бы написал:

@st.composite
def list_of_dicts_with_keys_matching(draw, keys=st.text(), values=st.text()):
    shared_keys = draw(st.sets(keys))
    return draw(st.lists(st.fixed_dictionaries(
        {k: values for k in shared_keys}
    )))
...