序列化库作为pickle的替代

ql-charon的Python项目详细描述


===
charon
=


charon使数据序列化和反序列化变得简单和安全。

,但与camel不同,它不强制使用特定的序列化格式。charon提供了一个简单的接口
,用于定义在复杂的python对象和原语之间转换的函数,这些函数可以
序列化为您选择的格式。

换句话说,这不是一个接受对象并将其序列化为json的工具。
这是一个接受对象并使用*用户定义的序列化函数*将其转换为基本的python类型,然后可序列化为json、yaml、msgpack等。

可以测试gistries(请参见"编写测试")。这在很大程度上依赖于"pytest"模块,允许用户在跟踪已实现版本的同时:


*测试已实现的转储程序和加载程序(请参阅"版本测试");
*测试是否所有转储程序和加载程序都有其测试(请参阅"metatests<;"metatests测试exisloader dumper tests的tence>;`
*只需对预定义的通用测试用例进行参数化即可轻松编写测试(请参见"通用测试"。




usage
===


ODEC注册表一起使用"charon.codec`"。

如果找到一个不是基本python类型的对象,它会再次尝试序列化它。这种反复出现的行为可能会耗费时间
(对于循环引用甚至是危险的)。

…注意:

首先,您必须创建一个将存储此转储程序的注册表。
此操作由:

::





要序列化的实例作为第一个参数提供给decorator。
第二个参数是*version*,它允许对类及其序列化结构进行版本控制。
此方法允许还原使用旧结构创建的序列化对象
(字段names可能会发生变化,变量可能会出现或消失,等等。


最后一个参数"类哈希"是可选的,用于版本测试(请参见"版本测试"。

不包含可用于还原此对象的基值。

…_时间增量转储程序:

::

@registry.dumper(datetime.timedelta,version=1,class\u hash='dadf350239d779d72d9c933ab52db1b')
def转储时间增量(obj):
返回{days':obj.days,'seconds':obj.seconds,'microseconds':obj.microseconds}




---创建加载程序也很简单。再次,您必须有一个注册表来存储这个加载程序(我们使用上一节中定义的
),再次,您必须修饰一个函数来接收数据,
,但这次这些数据是我们使用dumper函数创建的。

装载机装饰器类似于自卸车装饰器。第一个参数是我们应该反序列化的类
(我们将从接收到的数据实例化该类)。第二个参数version如上所述用于类实现的
版本控制。它允许开发人员更改其类的结构,并且仍然可以
将以前序列化的对象还原到这个新的结构中。


您修饰的函数应该接受一个参数:序列化
函数以前返回的数据(请参见medelta`).
从接收到的字典中,我们使用其构造函数(如果适用)或直接设置其内部变量(是的,这在反序列化数据时可能是适当的)重新创建对象。




@registry.loader(datetime.timedelta,version=1,class撸hash='dadF350239D3779D72D9C933AB52DB1B')
定义加载时间增量(数据):
返回日期时间。时间增量(天=数据['days',秒=数据['seconds',,微秒=数据['microseconds])



在定义了所有要序列化的类之后,我们可以使用"charon.codec"序列化
并反序列化对象。代码::python

>;>import datetime
>;>import charon,charon.extensions
>;>codec=charon.codec([charon.extensions.standard\u registry])
>;>delta=datetime.timedelta(seconds=42)
>;>;>>打印(编码)
{'!meta':{'dtype':'timedelta','version':2},'params':[0,42,0]}
>;>;loaded=codec.load(encoded)
>;>;print(delta)
0:00:42
>;>;print(loaded)
0:00:42
>;print(delta==loaded)
true

r/>==




注意:这些测试使用"pytest"模块。

本节介绍charon为测试装载机和转储程序提供的选项。
这些测试旨在帮助测试所有装载机和转储程序,并更新类结构。


ould表示用于测试序列化/反序列化管道的基本测试结构。_ pytest.mark.parametrize:https://docs.pytest.org/en/latest/parametrize.html
。_ pytest生成测试:https://docs.pytest.org/en/latest/parametrize.html;pytest生成测试

…_通用测试:



----
如果CT和反序列化对象与使用该测试的类匹配,则都将对它们进行测试。
这是一个健全的检查,以防止序列化一个类的实例并在反序列化后获取另一个类的实例。


如果可能的话,使用"vars"函数进行比较,否则使用标准的相等运算符(``````````````````````````````)。

usage
----

这最好在"conftest.py"中完成,因为我们稍后将使用它。
您还必须定义一个用于此测试的"序列化器"夹具。





import py test


import charon
from charon.testing.generic import test\u serialization管道



@pytest.fixture
def serializer():
返回charon.codec([registry])



然后必须定义参数。
可以将测试函数重命名为方便的名称,然后使用包装器调用它。
但是最好直接对其进行参数化。使用pytest标记"pytest.mark.parametrize"进行参数化的另一种方法是使用pytest的"pytest生成测试"功能。/>def pytest_generate_tests(metafunc):
"
"生成用于简单反序列化和序列化的测试用例。
如果metafunc.function,则由前缀为"generate"的函数生成测试用例。佩林':
元函数参数化('cls,original_obj',[(exampleclass,exampleclass('ahoy'))))

…_元测试:元测试-测试装载机/翻车机测试是否存在的测试测验。这种方法称为元测试。

当您想确保所有的转储程序和加载程序都有测试时,这些测试非常方便。



usage
----




要使用此元测试,您必须用"pytest.mark"标记转储程序和加载程序测试。

代码::python

@pytest.mark.charon(cls=exampleclass,dumper_test=true,loader_test=false)
def test_example_dumper(self):
pass

"`cls`"关键字指定此测试所针对的类,
``dumper_test``指定这是否是转储程序测试,显然,``loader_test``指定何时是加载程序测试。

然后您只需从"charon.testing.metatest"包导入元测试。

…代码::python

from charon.testing.metatest import(
test_charon_dumper_test s,
test_charon_loader_tests,
scope_charon_tests







所有装载机和翻车机方法都必须进行适当的测试。注意:这只测试测试的存在性。它不会测试为其编写测试的版本。要测试为其编写测试的版本,请参见"版本测试"。注意:

pytest.fixture(scope='module')(scope\u charon\u tests)


我们在模块作用域和会话作用域中创建此fixture,因为这可能会创建假阳性情况。
示例:
您在不同的编解码器中有两个注册表,它们序列化和以不同方式反序列化同一类。
这些编解码器中的一个具有该类的测试,而其他的没有。如果在这种情况下使用会话固定装置,则会得到假阳性检查,因为固定装置将返回为其中一个编解码器定义的测试
但另一个不行。元测试不检查哪个编解码器(实现)是测试绑定的。



…_版本测试:

-
-
版本测试
-


在大型项目中,有时很难跟踪类中的更改,也很难使它们的序列化保持最新。
例如,在一个项目中,一个类中有多个人对其进行colabort更改可以由多个
开发人员分别创建,其中一个开发人员可能忘记更新特定的转储程序和加载程序并增加其版本。

为了防止这种情况,charon可以选择创建类实现的哈希(ast的哈希)并用它。charon还包括来自"charon.testing.ast_hash"的测试,称为
"test_dumpers_version``
和"test_loaders_version``"。

用法
----


要使用此功能,必须首先创建当前的哈希NT实现。
这可以使用此包提供的"charon ast_hash"脚本来完成。
请参阅:`"generating a hash``

当我们有类实现的哈希时,我们将关键字添加到加载程序/转储程序的标准装饰符中。

代码::python

@registry.dumper(object,version=1,class廑hash='d2498176fad81ad017d1b0875eeeb1b')
def廑load廑object廑v1(廑):
pass

注意:

哈希只为最新版本的转储程序/加载程序保留,因为
我们无法使用特定类的较旧实现检查这些版本。

这些都是转储程序和加载程序实现中的更改。接下来,您必须将测试方法
`charon.testing.ast_hash.test_dumpers_version``和``charon.testing.ast_hash.test_loaders_version``
导入到测试文件中,并向其传递一个包含要测试的注册表的``charon.codec``实例。

。代码::python

来自charon.testing.ast_hash import test_dumpers_version,test_loaders_version

@pytest.fixture
def serializer():
返回charon.codec([我的注册表])


将根据当前类实现的哈希检查已定义"类哈希"的ch。_生成类散列:生成类实现的散列,可以使用charon提供的脚本led"charon"ast"u hash"。此脚本将要散列的类列表作为参数列表。

…注意:

此命令在内部使用``inspect``模块获取源代码,然后由``ast``模块解析源代码。
无法对来自`````u内置``和已编译库的方法和类进行哈希运算。



代码::bash

$charon_ast_hash datetime.datetime datetime.time
datetime.datetime:4927808ca19f2a1494719baa11024a7d
datetime.time:c36b819f18698ee9143ecd92e3788c66


一些内置在标准库中的python类型:

*``decimal.decimal``
*``set``
*``frozenset``
*``date time.datetime``
*``datetime.date``
*``datetime.time`
*``datetime.timedelta``

on.codec``有一个附加的注册表
``charon.extensions.standard嫒registry`.



-
示例用法
-



基本用法非常简单。您只需创建一个带有附加编解码器注册表的"charon.codec"对象,
"charon.extensions.standard_registry"`,
最好在列表的开头(如果您希望重写转储程序/加载程序的标准实现)。

代码::python

>;>import charon,charon.extensions
>;>import decimal
>;>codec=charon.codec([charon.extensions.standard\u registry])
>;>number=decimal.decimal('4.5')
>;4.5
>>>gt;serialized=codec.dump(number)
>>>gt;打印(serialized)
{!meta':{dtype':'decimal','version':1},'params':'4.5'}
>;>;loaded=codec.load(serialized)
>;>;print(loaded)
4.5

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

推荐PyPI第三方库


热门话题
java如何让用户决定按钮的特定颜色   java Tomcat jdbc连接池,使用后不释放连接   Java泛型类可分配性   javaactivemq&如何在路由路径中创建依赖关系   java为什么没有接收到操作用户?   windows如何启动使用cmd中预编译DLL的java swing应用程序?   java JFreechart实时组合图,在未收到数据点的情况下呈现step子图表的上一个值   java排序自定义数组列表   java如何从HSLFSlideShow获取文本格式信息   java不能将片段和活动登录结合起来   java是下载位于远程存储服务中的文件的有效方法   java AS:将点数交给GameOverActivity   java如何在textView中将焦点放在新生成文本的顶部?   HashMap中特定于Java存储的类类型   java使用不同的变量类型进行计算   if语句中的Java poll()   检查匹配括号的java字符堆栈没有错误,但也没有任何作用   java Netbeans不断将应用程序部署到错误的服务器