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

related的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/prior art

允许
如果"related"不满足您的需求,则可能值得查看的项目。

*[attrs]-驱动"related"功能的引擎。
*[django orm]-django的对象关系映射,它激发了"related"的设计。
*[cattrs]-处理n使用"Atths`.Br/**[Atgult]和[Box ] - Python字典包装器不需要模型。BR/**[杰克逊]基于序列化和去序列化对象的技术。
BR/> BR/>许可证< BR> > BR/> MIT许可证(MIT)< BR> Copyright(C)2017〔Ian Maurer〕,[ GyMnOnCo]ogy llc]




[flow image]:./.images/flow.png
[decorators.py]:./src/related/decorators.py
[fields.py]:./src/related/fields.py
[functions.py]:./src/related/functions.py
[attrs]:http://attrs.readthedocs.io/en/stable/
[本文按glyph]:https://glyph.twistedmatrix.com/2016/08/attrs.html
[genomology llc]:http://genomology.com
[ian maurer]:https://github.com/imaurer
[singledispatch library]:https://pypi.python.org/pypi/singledispatch
[monkey patching]: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.7.1(2018-10-13)
----
到相关的pypi页面[28]
-使singledispatch成为<;python 3.4的可选依赖项。感谢[ghostofgoes]。
-urlfield bug[20]
-python 3.7[27]修复的弃用警告



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


<0.6.1(2018-01-31)
----
-strict modesue 8]在接收未定义的密钥时引发异常。



>0.3(2017-06-23)
——————————————————————————————————————————————————————————————————————————————————————————————————————允许默认情况下,在键入的集合中为E。



>0.1(2017-05-24)
——————————————————————————————————————————————————————————————————————

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

推荐PyPI第三方库


热门话题
ByteArrayOutputStream的java解码属性   java S3 SDK在上载时更新单个对象,而不是创建新文件   java hibernate:无法从eclipse连接到DB   java如何在强制转换JComboBox之前检查其类型?   http从Java中的GETPOST请求方法捕获URI、资源名称,如开发人员工具中所示   java在Spring@Bean方法中返回接口的局限性   Java中的Web服务和客户端(使用Eclipse Apache Axis 2自底向上服务)某些代码会引发异常   java spring安全+rest不起作用   java将LinkedList添加到包含LinkedList的LinkedList并更改添加的LinkedList   java是否临时删除对象的属性?   java使用AnimatedGifEncoder类创建的gif图像的部分帧是不透明的   java如何高效地处理maven3时间戳快照?   java向集合对象添加另一项   java如何将动态参数传递给jquery函数   java使用libGdx桌面端口作为Android GLES20的仿真器