Python对象映射器

panamap的Python项目详细描述


泛地图

PyPI versionPyPI - Python VersionBuild StatusCoveralls github

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中描述。在

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

推荐PyPI第三方库


热门话题
ssl证书javax。网ssl。SSLHandshakeException:java。安全cert.CertificateException:没有与IP地址匹配的主题替代名称   基于组件的体系结构的java粒度   java在读取文件中的下一行和上一行时,我得到一个空指针异常   java是什么。StrutConfig。xml。strutsdia文件?   java中如何根据枚举字段对一组对象进行排序   java Firebase setPersistenceEnabled。导致大量内存使用   java奇数编译泛型类和列表错误   java类型org没有可用的源代码。石英克隆表达;您是否忘记继承所需的模块?   java如何使用map计算列表中整数列表的和,并获得一个新列表,其中每个条目对应于每个计算出的和?   java二进制搜索不会结束   java跳过Jackson中的错误JSON数据   在服务层中使用依赖项注入时引发java空指针异常。DAO类bean为空   访问者模式如何解释这两个Java程序运行时间的差异?   用Java扩展日历   java调用通用静态方法