跳转到主要内容

序列化所有Python

项目描述

关于Dill

dill扩展了Python的pickle模块,用于序列化和反序列化Python对象到大多数内置Python类型。序列化是将对象转换为字节流的过程,其逆过程是将字节流转换回Python对象层次结构。

dill为用户提供与pickle模块相同的接口,还包括一些附加功能。除了序列化Python对象外,dill还提供了保存解释器会话状态的单个命令的能力。因此,可以保存解释器会话,关闭解释器,将序列化文件发送到另一台计算机,打开新的解释器,反序列化会话,从而从原始解释器会话的“保存”状态继续。

dill 可用于将 Python 对象存储到文件中,但其主要用途是将 Python 对象作为字节流通过网络发送。 dill 非常灵活,允许任意用户定义的类和函数进行序列化。因此,dill 并未旨在防止错误构造或恶意构造的数据。用户需要自行决定他们反序列化的数据是否来自可信源。

dillpathos 的一部分,一个用于异构计算的 Python 框架。 dill 正在积极开发中,因此任何用户反馈、错误报告、评论或建议都备受欢迎。问题列表位于 https://github.com/uqfoundation/dill/issues,历史列表维护在 https://uqfoundation.github.io/project/pathos/query

主要特性

dill 可以序列化以下标准类型

  • none, type, bool, int, float, complex, bytes, str,

  • tuple, list, dict, file, buffer, builtin,

  • Python 类,namedtuples,dataclasses,metaclasses,

  • 类的实例,

  • set,frozenset,array,函数,异常

dill 还可以序列化更多“奇特”的标准类型

  • 带 yields 的函数,嵌套函数,lambda,

  • cell,method,unboundmethod,module,code,methodwrapper,

  • methoddescriptor,getsetdescriptor,memberdescriptor,wrapperdescriptor,

  • dictproxy,slice,notimplemented,ellipsis,quit

dill 目前还不能序列化以下标准类型

  • frame,generator,traceback

dill 还提供了以下功能

  • 保存和加载 Python 解释器会话

  • 保存和从函数和类中提取源代码

  • 交互式诊断序列化错误

当前版本

dill 的最新发布版本可在以下网址获取

http://pypi.ac.cn/project/dill

dill 根据 3-clause BSD 许可证分发。

开发版本

您可以在以下网址获取包含所有最新功能的最新开发版本

https://github.com/uqfoundation

如果您有新的贡献,请提交拉取请求。

安装

dill 可以使用 pip 安装

$ pip install dill

可选:在安装中包含 objgraph 诊断工具

$ pip install dill[graph]

可选:在安装中包含 gprof2dot 诊断工具

$ pip install dill[profile]

对于 Windows 用户,可选安装会话历史工具

$ pip install dill[readline]

需求

dill 需要

  • python(或 pypy),>=3.8

  • setuptools>=42

可选需求

  • objgraph>=1.7.2

  • gprof2dot>=2022.7.29

  • pyreadline>=1.7.1(在 Windows 上)

基本用法

dillpickle 的替代品。现有代码可以通过以下方式更新为允许完全序列化

>>> import dill as pickle

>>> from dill import dumps, loads

dumps 将对象转换为唯一的字节字符串,而 loads 执行相反操作

>>> squared = lambda x: x**2
>>> loads(dumps(squared))(3)
9

有几个选项可以控制序列化,这些选项作为关键字参数提供给几个 dill 函数

  • 使用 protocol,可以设置 pickle 协议级别。这使用与 pickle 模块相同的值,DEFAULT_PROTOCOL

  • 使用 byref=Truedill 在某些对象(如模块)的引用序列化方面表现得与 pickle 类似,而不是尝试序列化对象本身。

  • 使用 recurse=True,全局字典中引用的对象将被递归跟踪和序列化,而不是默认行为尝试存储整个全局字典。

  • 使用 fmode,可以序列化文件内容以及文件句柄,这在对象通过网络发送到没有原始文件的远程系统时非常有用。选项包括 HANDLE_FMODE(仅句柄)、CONTENTS_FMODE(文件内容)和 FILE_FMODE(内容和句柄)。

  • 使用 ignore=False,使用顶层脚本环境定义的类型重建的对象将使用环境中的现有类型,而不是可能不同的重建类型。

默认序列化也可以在 dill.settings 中全局设置。因此,我们可以在本地或全局修改 dill 处理全局字典引用的方式。

>>> import dill.settings
>>> dumps(absolute) == dumps(absolute, recurse=True)
False
>>> dill.settings['recurse'] = True
>>> dumps(absolute) == dumps(absolute, recurse=True)
True

dill 还包括源代码检查,作为序列化的替代方法。

>>> import dill.source
>>> print(dill.source.getsource(squared))
squared = lambda x:x**2

为了帮助调试序列化问题,请使用 dill.detect,它提供了如 pickle 跟踪等工具。

>>> import dill.detect
>>> with dill.detect.trace():
>>>     dumps(squared)
┬ F1: <function <lambda> at 0x7fe074f8c280>
├┬ F2: <function _create_function at 0x7fe074c49c10>
│└ # F2 [34 B]
├┬ Co: <code object <lambda> at 0x7fe07501eb30, file "<stdin>", line 1>
│├┬ F2: <function _create_code at 0x7fe074c49ca0>
││└ # F2 [19 B]
│└ # Co [87 B]
├┬ D1: <dict object at 0x7fe0750d4680>
│└ # D1 [22 B]
├┬ D2: <dict object at 0x7fe074c5a1c0>
│└ # D2 [2 B]
├┬ D2: <dict object at 0x7fe074f903c0>
│├┬ D2: <dict object at 0x7fe074f8ebc0>
││└ # D2 [2 B]
│└ # D2 [23 B]
└ # F1 [180 B]

通过跟踪,我们可以看到 dill 如何通过首先存储 _create_function(底层代码对象 Co)和 _create_code(用于处理代码对象)来存储 lambda(F1),然后处理全局字典的引用(D2)以及其他字典(D1D2),这些字典保存 lambda 对象的状态。# 标记对象实际存储的时间。

更多信息

开始使用最好的方式是查看 http://dill.rtfd.io 的文档。还可以查看 dill.tests,其中包含一系列脚本,展示了 dill 如何序列化不同的 Python 对象。您可以使用 python -m dill.tests 运行测试套件。任何 pickle 文件的内容都可以使用 undill 检查。由于 dill 遵循 pickle 接口,因此 http://docs.pythonlang.cn/library/pickle.html 中的示例和文档也适用于 dill(如果使用 import dill as pickle)。源代码也通常有很好的文档,因此可以通过检查代码本身来解决进一步的问题。请随时在 github 上提交问题,或在 stackoverflow 上提问(@Mike McKerns)。如果您想分享您如何在工作中使用 dill,请发送电子邮件(至 mmckerns at uqfoundation dot org)。

引用

如果您使用 dill 进行的研究导致发表,我们要求您在您的出版物中认可使用 dill,如下引用。

M.M. McKerns, L. Strand, T. Sullivan, A. Fang, M.A.G. Aivazis,
"Building a framework for predictive science", Proceedings of
the 10th Python in Science Conference, 2011;
http://arxiv.org/pdf/1202.1056

Michael McKerns and Michael Aivazis,
"pathos: a framework for heterogeneous computing", 2010- ;
https://uqfoundation.github.io/project/pathos

请参阅 https://uqfoundation.github.io/project/pathoshttp://arxiv.org/pdf/1202.1056 获取更多信息。

项目详细信息


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码分发

dill-0.3.9.tar.gz (187.0 kB 查看哈希值)

上传时间 源代码

构建分发

dill-0.3.9-py3-none-any.whl (119.4 kB 查看哈希值)

上传时间 Python 3

由以下支持