2012-09-18 28 views
2

如何使用colander库验证以下数据结构?在漏勺中的变量字典

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

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

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

回答

1

看着文档,我不认为你可以。你可以让你的周围由defining your own validator提到的限制:

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

+0

你有@Mikolaj Siedlarek的特定情况下的工作示例? – Natim

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))) 
+0

问题与解答。因为我无法将第一个答案中的所有代码放在注释中。 – Natim

+0

此解决方案已得到确认吗?它实际上有效? –

+0

@AndrewBurnett我很高兴它解决了你的问题。是的,你可以使用第二个。 – Natim