声明性数据映射器
data-mapper的Python项目详细描述
数据映射器
声明性数据映射器
说明
大多数项目使用相同数据的不同表示。 每次为在其表示形式之间转换数据而编写的代码 基本上是非常重复的。更重要的是,它总是一个错误和问题的存款 这需要开发人员或测试人员对其进行单元测试。
这个软件包试图解决这些问题…好吧,至少 普通的。
为了使开发人员的工作更容易,它主要设计用于 以陈述性的方式:描述你想要的,然后马上得到。
用例和特性
以下是最常见的用例和特性的示例:
不同的命名方案
此映射器在数据中查找属性first_name
和last_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_name
,middle_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