我想生成一个字典列表,其中所有字典都具有相同的键集。
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': ''}])
答案 0 :(得分:0)
您在draw(...)
中缺少return draw(st.lists(st.fixed_dictionaries(mapping)))
。
但是,这将导致您遇到第二个问题-st.fixed_dictionaries
将键映射到价值策略,但是mapping
这里是{{1} }。也许:
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)))