声明性数据映射器

data-mapper的Python项目详细描述


数据映射器

声明性数据映射器

PyPITravis (.org) branch

说明

大多数项目使用相同数据的不同表示。 每次为在其表示形式之间转换数据而编写的代码 基本上是非常重复的。更重要的是,它总是一个错误和问题的存款 这需要开发人员或测试人员对其进行单元测试。

这个软件包试图解决这些问题…好吧,至少 普通的。

为了使开发人员的工作更容易,它主要设计用于 以陈述性的方式:描述你想要的,然后马上得到。

用例和特性

以下是最常见的用例和特性的示例:

不同的命名方案

此映射器在数据中查找属性first_namelast_name。 对于属性first_name,它试图通过第一个键来解析它 'first_name',如果找不到,则尝试第二个键'name'。 类似的过程也适用于属性last_name

fromdata_mapper.mappersimportMapperfromdata_mapper.propertiesimportPropertyclassPersonMapper(Mapper):first_name=Property('first_name','name')last_name=Property('last_name','surname')mapper=PersonMapper()assertmapper.get({'first_name':'Ivan','surname':'Bogush',})=={'first_name':'Ivan','last_name':'Bogush',}assertmapper.get({'name':'Ivan','surname':'Bogush',})=={'first_name':'Ivan','last_name':'Bogush',}

这个用例有一个故事:)

It was the first issue I wanted to solve in my other project. I had different naming schemes in different data sources, and in my databases. All of them used different names for product categories: 'categories', 'category', 'categoryId'. I found it very boring to write repeatable code to convert the same data.

解析值的任意运算

全名字符串构造

这个函数解析属性first_namemiddle_name[可选]和 last_name并将它们组合成单个字符串-full_name

fromdata_mapper.properties.operationsimportOperationfromdata_mapper.properties.stringimportStringPropertyfull_name=Operation(StringProperty('first_name'),StringProperty('middle_name',required=False),StringProperty('last_name'),func=lambda*args:' '.join(filter(None,args)),)assert'Anton Pavlovich Chekhov'==full_name.get(dict(first_name='Anton',middle_name='Pavlovich',last_name='Chekhov',))assert'Anton Chekhov'==full_name.get(dict(first_name='Anton',last_name='Chekhov',))

对象映射

听写到object

假设我们有一个类Person

classPerson:def__init__(self,id_:int,first_name:str,last_name:str,middle_name:str=None,):self.id=id_self.first_name=first_nameself.last_name=last_nameself.middle_name=middle_name

dict中的映射程序,具有类Person实例的对应键。 可以通过子类定义ObjectMapper

fromdata_mapper.mappers.objectimportObjectMapperfromdata_mapper.properties.compoundimportCompoundPropertyfromdata_mapper.properties.compound_listimportCompoundListPropertyfromdata_mapper.properties.integerimportIntegerPropertyfromdata_mapper.properties.stringimportStringPropertyclassPersonMapper(ObjectMapper):init=Personargs=CompoundListProperty(IntegerProperty('id'),StringProperty('first_name'),StringProperty('last_name'),)kwargs=CompoundProperty(middle_name=StringProperty(required=False),)first,middle,last='Iosif Aleksandrovich Brodsky'.split()person=PersonMapper().get(dict(id=1940,first_name=first,middle_name=middle,last_name=last,))assertisinstance(person,Person)assertperson.id==1940assertperson.first_name==firstassertperson.middle_name==middleassertperson.last_name==last

通过实例化ObjectMapper

fromdata_mapper.mappers.objectimportObjectMapperfromdata_mapper.properties.compoundimportCompoundPropertyfromdata_mapper.properties.compound_listimportCompoundListPropertyfromdata_mapper.properties.integerimportIntegerPropertyfromdata_mapper.properties.stringimportStringPropertymapper=ObjectMapper(init=Person,args=CompoundListProperty(IntegerProperty('id'),StringProperty('first_name'),StringProperty('last_name'),),kwargs=CompoundProperty(middle_name=StringProperty(required=False),),)first,middle,last='Iosif Aleksandrovich Brodsky'.split()person=mapper.get(dict(id=1940,first_name=first,middle_name=middle,last_name=last,))assertisinstance(person,Person)assertperson.id==1940assertperson.first_name==firstassertperson.middle_name==middleassertperson.last_name==last

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

推荐PyPI第三方库


热门话题
未检测到“空格”的java ASCII码   音频如何在Java中设置SourceDataLine的音量   java MyBatissSpringBoot无法使用作为bean注入的数据源   Java字谜递归列表<List<String>>仅存储空列表<Strings>   java显示30px高的JPanel,然后用minecraft填充剩余空间   java JOGL平滑度   Java:按完整与否对1d对象数组进行排序   arraylist仅当java结构不存在时才将对象添加到java结构中   无法初始化java渲染库在安卓 studio 4.1.1上出现错误   java SpringBoot ClassCastException   java解析文本文件,基于字数   java=运算符引发异常   java使点可拖动并存储新坐标JavaFx   JavaWebSphereApplicationServer:EJB模块和JMS路由器