我试图使用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.

10-04 11:51