跳转到主要内容

Python结构的声明性反序列化

项目描述

由于使用colander时的挫败感,我决定创建类似的东西...

Objective是一个具有以下功能的反序列化工具

  • 目标的声明性定义。

  • 如何定义某事物不会产生混淆,它始终是一样的。

  • 通过继承重用定义。

  • 可选验证。

  • 使覆盖某些部分变得简单。

用法

简单的映射和验证

import objective
import datetime


now = datetime.datetime(2001, 9, 11)


class UserObjective(objective.Mapping):

    name = objective.Item(objective.Unicode, missing=objective.Ignore)
    email = objective.Item(objective.Unicode, validator=objective.Email())
    password = objective.Item(objective.Unicode)
    since = objective.Item(objective.UtcDateTime, missing=now)


serialized = {
    'email': 'foo@example.com',
    'password': 'foobar'
}


deserialized = UserObjective.deserialize(serialized)


assert deserialized == {
    'password': u'foobar',
    'email': u'foo@example.com',
    'since': datetime.datetime(2001, 9, 11, 0, 0)
}


bad_serialized = {
    'name': 'foobar'
}


try:
    deserialized = UserObjective().deserialize(bad_serialized)

except objective.Invalid as e:

    assert isinstance(e, objective.exc.InvalidChildren)
    assert {(x.node.__name__, x.__class__, x.value) for x in e.children} == {
        ('password', objective.exc.MissingValue, objective.values.Undefined),
        ('email', objective.exc.InvalidValue, 'baz')
    }

映射复杂结构

import objective


class ProductRequestObjective(objective.BunchMapping):
    @objective.Item()
    class body(objective.Mapping):
        name = objective.Item(objective.Unicode)
        root = objective.Item(objective.Unicode)

        @objective.Item()
        class semantics(objective.List):
            items = objective.Item(objective.Unicode)

    @objective.Item()
    class match(objective.Mapping):
        _id = objective.Item(objective.Field)

问题、想法、建议

objective还远未完善。我能够想象出许多可能的验证器。

我尽力测试了(主要是时间上)。

如果您发现错误或您有一个好主意,我完全愿意实现它。

项目详情


下载文件

下载适用于您平台的应用程序。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码发行版

此版本没有可用的源代码发行版文件。请参阅生成发行版存档的教程。

构建发行版

objective-0.0.13-py2.py3-none-any.whl (10.2 kB 查看散列值)

上传时间 Python 2 Python 3

由以下支持