跳转到主要内容

序列化所有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 类、namedtuple、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 的最新版本可在以下网址获取

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

dill 采用 3 条款 BSD 许可证。

开发版本

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

https://github.com/uqfoundation

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

安装

dill 可以使用 pip 安装

$ pip install dill

可选地包括安装 objgraph 诊断工具

$ pip install dill[graph]

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

$ pip install dill[readline]

要求

dill 需要

  • python(或 pypy),>=3.7

  • setuptools>=42

可选要求

  • objgraph>=1.7.2

  • 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还包括源代码检查,作为pickle的替代方案。

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

为了帮助调试pickle问题,请使用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如何存储lambda(F1):首先存储_create_function,底层代码对象(Co)和_create_code(用于处理代码对象),然后处理全局字典的引用(D2)以及其他字典(D1D2),这些字典保存lambda对象的状态。#标记了对象实际存储的时间。

更多信息

入门的最佳方式可能是查看http://dill.rtfd.io上的文档。还可以查看dill.tests,其中包含一组演示如何使用dill序列化不同Python对象的脚本。您可以使用python -m dill.tests运行测试套件。任何pickle文件的内容都可以使用undill检查。由于dill符合pickle接口,因此https://docs.pythonlang.cn/library/pickle.html上找到的示例和文档也适用于dill,如果将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-pylint-0.3.6.dev0.tar.gz (178.4 kB 查看哈希

上传时间:

构建分布

dill_pylint-0.3.6.dev0-py3-none-any.whl (110.7 kB 查看哈希

上传时间: Python 3

由...支持