【发布时间】:2019-08-05 23:13:35
【问题描述】:
我正在寻找一种用于验证字典的解决方案,其中一个约束是 is in 约束,其中被认为有效的值来自正在验证的字典本身。
例如,想象下面的伪模式
{
"notions" : [ string ],
"category" : [ is in notions ]
}
为了完全清楚,我也口头表达了这个伪模式的约束。这些是我要验证的约束,是d要验证的字典:
set(d.keys()) == {"notions", "categories"}isinstance(d["notions"], list)isinstance(notion, str) for notion in d["notions"]isinstance(d["category"], list)element is in d["notion"] for element in d["category"]
不要问,这个特定的数据结构是否有意义。它不是。我只是弥补,为我的问题创建一个最小的例子。我的实际字典模式要复杂得多,并且会对字典中的值进行多次引用。这就是为什么我想避免手动定义和验证约束,而是更喜欢基于模式的解决方案。
我查看了一些架构验证库,但我没有发现任何地方都包含此功能。是否有基于某些库的解决方案,也许有一些小的调整?我宁愿不要第二次发明轮子。
【问题讨论】:
-
好吧,好吧,我们不需要谈论架构。但我不知道
isinstance(notion, string) for notion in d["notions"](第 3 点)应该做什么。 -
@roganjosh 对不起,这应该是
isinstance(notion, str) for notion in d["notions"],这应该意味着列表d["notions"]的所有项目都是字符串。 -
我有点希望typing module 在构建 字典时涵盖其中的一些内容,但不是全部。这是相当广泛的测试;我认为这是一个测试套件,而不是常规流程的一部分?
-
d.keys() == ["notions", "categories"]可能会受到 Python element is in d["notion"] for element in d["category"] 只会不断增长。 -
@roganjosh:打字处理的是对象类型,而不是值。
str是对象类型,all(v in d['notion'] for v in d['category'])是值限制。
标签: python validation dictionary schema