我试图使用colander来定义一个可以有任何类型的schemanode。我希望它只从json中获取反序列化的内容并将其传递。有可能吗?
class Foo(colander.MappingSchema):
name = colander.SchemaNode(colander.String(), validator=colander.Length(max=80))
value = colander.SchemaNode(??) # should accept int, float, string...
最佳答案
这些colander类型派生自schematype并实现实际执行序列化和反序列化的方法。
我能想到的唯一方法是编写您自己的SchemaType实现,它本质上是一个包装器,用于测试值并应用Colander中定义的类型之一。
我觉得没那么难,只是不好看。
编辑:这是一个草稿示例我没有测试过,但它传达了我的想法。
class AnyType(SchemaType):
def serialize(self, node, appstruct):
if appstruct is null:
return null
impl = colander.Mapping() # Or whatever default.
t = type(appstruct)
if t == str:
impl = colander.String()
elif t == int:
impl = colander.Int()
# Test the others, throw if indeterminate etc.
return impl.serialize(node, appstruct)
def deserialize(self, node, cstruct):
if cstruct is null:
return null
# Test and return again.