相关:python中的直接嵌套对象模型

related-li的Python项目详细描述



<;a href='https://codecov.io/github/genomology/related/'>;<;img src='https://codecov.io/github/genomology/related/branch/master/graph/badge.svg'align="right"/>;
<;a href='https://travis-ci.org/genomology/related'>;<;img src='https://img.shields.io/travis/genomology/related.svg'align="right"/>;<;/a>;
<;a href='https://pypi.python.org/pypi/related'>;<;img src='https://img.shields.io/pypi/v/related.svg'align="right"/>;

<;br/>;



`related`是一个python库,用于创建嵌套的对象模型
,该模型可以序列化到
嵌套的python词典并从中反序列化。
当与其他库(例如[pyyaml])配对时,
related`对象模型可以用于转换到
嵌套的数据格式(例如json,yaml)。


"相关"对象模型的示例用例包括:

*配置文件读取和写入
*rest api消息响应生成和请求处理
*文档存储的对象文档映射(例如mongodb、elasticsearch)
*数据导入解析或导出生成

<;br/>;

!【流程图】













*python(2.7,3.5,3.5,3.6)





























>与导入相关




>与导入相关的python




类人员(对象:
名字=相关的.stringfield()
姓氏=相关的.stringfield()

@related.immutable
类rolemodels(对象):
科学家=相关的.setfield(人)

people=[人(名字="grace",姓氏="hopper"),
人(名字="k雅典娜,姓约翰逊,
人(姓凯瑟琳,姓约翰逊)]

/>姓氏:johnson
````



版本:"2"
服务:
网站:
内部版本:。
端口:
-5000:5000
卷:
-。/code
redis:
图像:redis
``````

下面是表示上述配置的"相关"对象模型。
请注意服务(即web、redis)由模型表示。




`` python
import related


@related.immutable
类服务(对象):
name=related.stringfield()
image=related.stringfield(必需=false)
build=related.stringfield(必需=false)
端口=相关。序列字段(str,必需=false)
卷=相关。序列字段(str,必需=false)
命令=相关。字符串字段(必需=false)



@related.immutable
类组合(对象):
版本=相关。字符串字段(必需=false,default=none)
services=related.mappingfield(service,"name",required=false)
````


然后使用便利的
方法之一加载上述yaml,然后返回yaml以检查是否已维护格式
。"related"模块使用"orderedict"对象
,以便在默认情况下保持排序顺序。

``python
从os.path导入join,dirname

e.yml")



def test_compose_from_yml():
original_yaml=打开(yml_文件).read().strip()
yml_dict=from_yaml(original_yaml)
compose=to_model(compose,yml_dict)


assert compose.version=='2'
assert compose.services['web'].ports==["5000:5000"]
assert compose.services['redis'.image=="redis"

=to_yaml(compose,
suppress_empty_values=true,
suppress_map_key_values=true).strip()


assert original_yaml==generated_yaml
````


/]此项目的文件夹。
下面是到目前为止提供的测试的链接和说明。

0]上面的第一个示例显示了setfields是如何工作的。|
[示例01]上面的第二个示例演示了yaml(de)序列化。|
|
[示例04]具有枚举类值字段的多类对象模型。|
[示例05]处理包括python关键字在内的属性的重命名。|
[示例06]使用timefield、datetimefield和decimalfield的基本JSON(de)序列化。|
[示例07]函数装饰器,用于将输入转换为obj,并将输出转换为dict
[示例08]使用字符串处理自引用和无序引用。|


在不使用继承的情况下创建python类时需要很多样板

attrs提供的一些核心功能:

*生成的初始值设定项方法e``````````````````````````````````````````````人类可读的表示方法
(````````````repr``)
*属性转换器和验证程序框架



"相关"项目是在"attrs"库之上构建的一个独立层
,它提供以下功能:

处理与基本数据类型(如
``str``、``float``和``bool``)之间的验证和转换的IELD。
*支持关系(如
子、序列、映射和对象集)的嵌套字段。
*``转换嵌套对象图的函数s
到python字典。
使[singledispatch library]可自定义(不诉诸[monkey patching])

*``到'u model``函数,该函数实例化了从
python字典到相关模型的反序列化过程使用的类。
*conversion helper函数
(`` to`u yaml``,`` from`u yaml`,`` to`u json`,`` from`u json``)
,可以方便地在
相关模型和数据格式之间进行转换。
*``@mutable``和```@immutable``用于将类
作为相关模型进行装饰,而不需要增加继承
main可保持性和灵活性。



实例化可更改对象的相关类。|
@immutable激活实例化不可更改对象的相关类。|

请参见[装饰工。py]文件以查看源代码,直到生成正确的
文档。



字段。|
childfield指定类型"cls"的子对象。|
日期字段"日期"字段使用"格式化程序"格式化。|
datetime field"datetime"字段使用"格式化程序"格式化。|
time field"time"字段使用"formatter"格式化。|
float field"float"值字段。|
integerfield`int`值字段。|
mappingfield(cls,key)按"key"字段值索引的"cls"类型对象字典。|
regex field(regex)"str"值字段,由re.match(`regex`)验证。|
sequencefield(cls)所有指定类型"cls"的对象列表。|
setfield对象集所有指定类型的"cls"。|
stringfield`str`值字段。|
urlfield[parseResult]对象。|
uuidfield[uuid]对象,如果未指定,则默认情况下将创建[uuid4]。|



由于底层"attrs"项目的强大功能,添加自己的字段类型相当简单。
请参见[fields.py]文件,了解如何构造上述内容。




——————————————————————————————————————————————————————————————————————————————————————|
from_yaml(s,cls)将yaml字符串或流转换为指定的类。|
is_related(obj)如果对象是@mutable或@immutable,则返回true。|
to_dict(obj)用于转换为dict的单分派函数。
to_json(obj)通过to_dict将对象转换为(漂亮的)json字符串。
to_model(cls,value)将值转换为"cls"实例。|
to_yaml(obj)通过to_dict将对象转换为yaml字符串。



请参阅[functions.py]文件以查看源代码,直到生成正确的
文档。



credits/现有技术

"相关"项目受到以下项目的严重影响,这些项目可能值得一看t如果"related"不能满足您的需要。

*[attrs]-驱动"related"功能的引擎。
*[django orm]-激发"related"设计的django对象关系映射。
*[cattrs]-使用"attrs"处理嵌套对象的替代方法。
*[adict]和[box]-不需要的python字典包装器这是一个模型。
*[jackson]-基于java的序列化和反序列化对象技术。














mit许可(mit)版权(c)2017[伊恩莫伊雷雷尔],[基诺蒙科洛伊有限责任公司]





[flow image]./.images/flow.png
[decorators.py./src/relatecorcorcorators.py./src/related/fiel/fiel/fiel-license


mit mit许可(是的ds.py
[functions.py]:./src/related/functions.py
[attrs]:http://attrs.readthedocs.io/en/stable/
[本文由glyph撰写]:https://glyph.twistedmatrix.com/2016/08/attrs.html
[genomenology llc]:http://genomenology.com
[ian maurer]:https://github.com/imaurer
[singledispatch library]:https://pypi.python.org/pypi/singledispatch
[猴子补丁]:http://stackoverflow.com/questions/5626193/what-is-a-monkey-patch
[django-orm]:https://docs.djangoproject.com/en/1.11/topics/db/models/
[uuid]:https://docs.python.org/3/library/uuid.html uuid.uuid
[uuid4]:https://docs.python.org/3/library/uuid.html uuid.uuid4
[parseresult]:https://docs.python.org/2/library/urlparse.html urlparse.parseresult
[cattrs]:http://cattrs.readthedocs.io/en/latest/readme.html
[adict]:https://github.com/mewwts/adict
[box]:https://pypi.python.org/pypi/python box
[jackson]:https://github.com/fasterxml/jackson
[docker编写示例]:https://docs。docker.com/compose/gettingstarted/step-3-define-services-in-a-compose-file
[pyyaml]:https://pypi.python.org/pypi/pyyaml

[tests/]:。/tests/
[example 00]:。/tests/ex00-set-hash
[example 01]:。/tests/ex01-compose-v2
[example 02]:。/tests/ex02-compose-v3.2
[example 03]:。/tests/ex03_company
[示例04]:。/tests/ex04_contact
[示例05]:。/tests/ex05_field_names
[示例06]:。/tests/ex06_json
[示例07]:。/tests/ex07_serializer
[示例08]:。/tests/ex08_self_reference


<0.6.2(2018-02-12)
----
on[gabrieldav]:timefield和datetimefield字段。



0.6.1(2018-01-31)
----
-严格模式[issue 8]在接收未定义的密钥时引发异常。



<0.3(2017-06-23)
-
-新类型:immutabledict
-在typedm上添加函数apping
-在from_yaml和from_json函数中修复错误。



>0.2(2017-06-05)
----
-在类型化集合中默认不允许任何错误。



<0.1(2017-05-24)
----
-初始版本。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java有没有办法使多个对象初始化更紧凑?   java确保BUnit包和测试包不包含在生产代码中   java如何使JTextField更小,而不是填满整个空间?   javaawt的矩形交点   用户连续登录应用程序的java条纹(Android)   maven如何在服务器上运行java项目,并将其作为jar添加到EAR项目中   java如何在jar/war的资源文件夹中创建png?   swing在Java中未选择列表项时禁用按钮   java GridView x BaseAdapter并在onItemClick中重新加载   java Apache POI未应用某些颜色索引   java创建URL使用uri有什么区别。解析/uri。生成器/连接字符串?   java JavaFX jfoenix运行时错误(JFXDatePicker)   右旋转二叉搜索树   在Java标准版中运行Java移动应用程序   java为什么要为每个实例创建静态hashmap?   java如何使用RTC唤醒和报警意图   java获取对象中的JSON表达式   (Java)服务器不接受多个连接   java为什么我的目的地为null?   java使用多个参数执行存储过程,并使用spring数据jpa将结果集映射到非实体类