2

如何使用滤锅库验证以下数据结构?

[
    {
        'bar': ['a', 'b', 'c'],
        'variable2': ['b', 'c'],
        'foo': ['a', 'c'],
    },
    {
        'something': ['foo', 'bar'],
    },
]

问题是这些映射可以有任意数量的键值对,并且键名称空间不受限制。我还想确保每个键都是一个字符串,每个值都是一个字符串序列。

我可以使用Mapping(unknown='preserve'),但它不会验证类型。

4

2 回答 2

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)))
于 2013-10-12T20:30:00.957 回答
0

查看文档,我认为您不能。您可以通过定义自己的验证器来解决您提到的限制:

验证器是一个可调用的,它接受两个位置参数:nodevalue. None如果值有效,则返回。colander.Invalid如果值无效,它会引发异常。

于 2012-09-18T11:44:44.903 回答