Python 如何创建一个;“类型不可知论者”;漏勺阳极
我试图使用colander定义一个可以有任何类型的SchemaAnode。我希望它只是从JSON中获取任何反序列化的内容并将其传递出去。可能吗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
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
稍后我可能会添加一些用于日期/日期时间检测的内容