如何使用colander库验证以下数据结构?
[
{
'bar': ['a', 'b', 'c'],
'variable2': ['b', 'c'],
'foo': ['a', 'c'],
},
{
'something': ['foo', 'bar'],
},
]
问题是这些映射可以包含任意数量的键值对,并且键命名空间不受限制。我还想确保每个键都是一个字符串,每个值都是一个字符串序列。
我可以使用Mapping(unknown='preserve')
,但不会验证类型。
答案 0 :(得分:1)
查看文档,我认为你不能。您可以绕过defining your own validator提到的限制:
验证器是一个可调用的,它接受两个位置参数:
node
和value
。如果值有效,则返回None
。如果值无效,则会引发colander.Invalid
异常。
答案 1 :(得分:1)
我这样做但似乎不起作用:
class PolicyValidator(SchemaNode):
def __init__(self):
super(PolicyValidator, self).__init__(
Mapping(unknown='preserve'), validator=self.policy_range)
# self.add(SchemaNode(Range(min=0, max=0xFFFF), name="preserved"))
def policy_range(self, node, policy):
for value in policy.itervalues():
if value < 0 or value > 0xFFFF:
raise Invalid(node, '%r is not a valid permission.' % value)
我找到了另一个解决方案:
class PolicyValidator(SchemaNode):
def __init__(self, policy):
super(PolicyValidator, self).__init__(Mapping(unknown='preserve'))
for key in policy.iterkeys():
self.add(SchemaNode(Int(), name=key,
validator=Range(min=0, max=0xFFFF)))