我正在尝试做一些我认为应该直截了当的事情,但我遇到了让它工作的问题。这就是我现在所拥有的,它按预期工作。
some_schema = Schema(
multiples = ForEach(UnicodeString(), convert_to_list=True),
single = OneOf(['a', 'b'])
)
我想要做的是在多值字段被转换为 unicode 字符串列表后对其应用 MaxLength 验证器。但是,它似乎不喜欢我对复合(例如,All、Pipe)或自定义验证器的任何尝试。在我看来,这是实现这一目标的最直接方法。
some_schema = Schema(
multiples = All(MaxLength(5), ForEach(UnicodeString(), convert_to_list=True)),
single = OneOf(['a', 'b'])
)
根据文档,多值字段应转换为 unicode 字符串列表,然后通过 MaxLength 验证器运行,如果大于 5 个元素则失败。失败部分有效:
>>> some_schema.to_python({'single':'a', 'multiples': range(6)})
>>> Invalid: multiples: Enter a value less than 5 characters long
但是,似乎应该通过的示例实际上失败了:
>>> some_schema.to_python({'single':'a', 'multiples': range(3)})
>>> Invalid: multiples: Please provide only one value
formencode 文档虽然总体上非常好,但无法阐明该主题。查看源代码,这是来自 Schema 类的单值预期异常。我尝试将accepts_iterator=True
参数传递给 Schema,但这也失败了。
如何确保架构中的字段是 unicode 字符串列表并且长度小于 N?