Python对象映射器
panamap的Python项目详细描述
泛地图
Panamap是一个Python对象映射器。在使用 类似的数据,例如protobuf生成的文件和域模型。在
安装
使用包管理器pip安装panamap。在
pip install panamap
使用
映射原始值
panamap最简单的用法是映射原始值:
^{pr2}$有一组标准原始值转换器。在
使用转换器映射类
mapper最严格的用法是将转换器从类A设置为类B。 以下是此类设置的示例:
frompanamapimportMapperclassA:def__init__(self,a_value:int):self.a_value=a_valueclassB:def__init__(self,b_value:int):self.b_value=b_valuemapper=Mapper()mapper.mapping(A,B) \ .l_to_r_converter(lambdaa:B(a.a_value)) \ .register()b=mapper.map(A(123),B)print(b.b_value)# 123
如果值集有限,则枚举是最常见的情况,可以使用实用函数values_map
:
fromenumimportEnumfrompanamapimportMapper,values_mapclassLangA(Enum):PYTHON=1JAVA=2CPP=3classLangB(Enum):PY=1JAVA=2CPP=3mapper=Mapper()mapper.mapping(LangA,LangB) \ .l_to_r_converter(values_map({LangA.PYTHON:LangB.PY,LangA.JAVA:LangB.JAVA,LangA.CPP:LangB.CPP,})) \ .register()print(mapper.map(LangA.PYTHON,LangB).name)# PY
映射上下文
在某些情况下,您需要向映射操作传递一些上下文。
可以用map
方法中的context
参数来完成。
Context是dict,将作为第二个参数传递给converter。在
frompanamapimportMapperclassA:def__init__(self,a_value:int):self.a_value=a_valueclassB:def__init__(self,b_value:int,contextual:str):self.b_value=b_valueself.contextual=contextualmapper=Mapper()mapper.mapping(A,B) \ .l_to_r_converter(lambdaa,ctx:B(a.a_value,ctx["contextual"])) \ .register()b=mapper.map(A(123),B,{"contextual":"contextual value"})print(b.contextual)# 'contextual value'
映射简单类
设置映射器对象的映射调用mapping
函数。
每个字段对可以用bidirectional
函数绑定,如果我们只需要一个,可以分别用l_to_r
和{
以下是一些示例:
frompanamapimportMapperclassA:def__init__(self,a_value:int):self.a_value=a_valueclassB:def__init__(self,b_value:int):self.b_value=b_valuemapper=Mapper()mapper.mapping(A,B) \ .l_to_r("a_value","b_value") \ .register()b=mapper.map(A(123),B)print(b.b_value)# 123# a = mapper.map(B(123), A) will raise MissingMappingException cause we didn't set any r_to_l map rulesbidirectional_mapper=Mapper()bidirectional_mapper.mapping(A,B) \ .bidirectional("a_value","b_value") \ .register()b=bidirectional_mapper.map(A(123),B)print(b.b_value)# 123a=bidirectional_mapper.map(B(123),A)print(a.a_value)# 123shifting_mapper=Mapper()shifting_mapper.mapping(A,B) \ .l_to_r("a_value","b_value",lambdaa:a+1) \ .r_to_l("a_value","b_value",lambdab:b-1) \ .register()b=shifting_mapper.map(A(123),B)print(b.b_value)# 124a=shifting_mapper.map(B(123),A)print(a.a_value)# 122
映射空类
有时需要将一个空类转换为另一个空类。对于这种情况,有_empty
版本的map config
功能:
frompanamapimportMapperclassA:passclassB:passmapper=Mapper()mapper.mapping(A,B) \ .bidirectional_empty() \ .register()b=mapper.map(A(),B)print(isinstance(b,B))# True
映射嵌套字段
Panamap支持嵌套字段的映射。要对嵌套字段执行此映射,必须设置类。在
fromdataclassesimportdataclassfrompanamapimportMapper@dataclassclassNestedA:value:str@dataclassclassA:value:NestedA@dataclassclassNestedB:value:str@dataclassclassB:value:NestedBmapper=Mapper()mapper.mapping(A,B) \ .map_matching() \ .register()mapper.mapping(NestedA,NestedB) \ .map_matching() \ .register()b=mapper.map(A(NestedA("abc")),B)print(isinstance(b.value,NestedB))# Trueprint(b.value.value)# abc
从dict到dict的映射
Panamap允许设置映射frm和dict对象。下面是一个例子:
fromtypingimportListfromdataclassesimportdataclassfrompanamapimportMapper@dataclassclassNested:value:str@dataclassclassA:nested:Nestedlist_of_nested:List[Nested]mapper=Mapper()mapper.mapping(A,dict) \ .map_matching() \ .register()mapper.mapping(Nested,dict) \ .map_matching() \ .register()a=mapper.map({"nested":{"value":"abc",},"list_of_nested":[{"value":"def",},{"value":"xyz",},]},A,)print(a)# A(nested=Nested(value='abc'), list_of_nested=[Nested(value='def'), Nested(value='xyz')])
映射protobuf生成的类
要映射protobuf生成的类,请使用单独的模块panamap-proto。在
贡献
贡献在separate document中描述。在
- 项目
标签: