Python 如何创建一个;“类型不可知论者”;漏勺阳极

Python 如何创建一个;“类型不可知论者”;漏勺阳极,python,pyramid,Python,Pyramid,我试图使用colander定义一个可以有任何类型的SchemaAnode。我希望它只是从JSON中获取任何反序列化的内容并将其传递出去。可能吗 class Foo(colander.MappingSchema): name = colander.SchemaNode(colander.String(), validator=colander.Length(max=80)) value = colander.SchemaNode(??) # should accept int, f

我试图使用colander定义一个可以有任何类型的SchemaAnode。我希望它只是从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.

我只需要反序列化,所以我使用了SpiritMachine答案的简化版本:

class AnyType(colander.SchemaType):
    def deserialize(self, node, cstruct):
        return cstruct
稍后我可能会添加一些用于日期/日期时间检测的内容