dill:Python中增强版的pickle

简介: dill:Python中增强版的pickle

1 简介

大家好我是费老师,相信不少读者朋友们都在Python中利用pickle进行过序列化操作,而所谓的序列化,指的是将程序运行时在内存中产生的变量对象,转换为二进制类型的易存储可传输数据的过程,相反地,从序列化结果解析还原为Python变量就叫做反序列化。

通常我们都是用标准库pickle进行这项操作,但其功能单一,且针对很多常见的Python对象如lambda函数无法进行序列化。而今天费老师我要给大家介绍的库dill就可以看作增强版的pickle

2 使用dill实现更丰富的序列化/反序列化操作

作为第三方库,我们使用pip install dill完成安装后,就可以使用它来代替pickle了:

2.1 基础使用

dill的基础使用与pickle一样,使用dump/dumps进行序列化操作,load/loads进行反序列化操作,下面是一些基本的例子,我们对一些常见的对象进行序列化/反序列化操作:

import dill
import numpy as np
demo_int = 999
demo_float = 0.99
demo_dict = {'a': 999}
demo_array = np.random.rand(2, 2)
# 序列化并写出到pkl文件
with open('./demo.pkl', 'wb') as d:
    dill.dump(
        [demo_int, demo_float, demo_dict, demo_array],
        d
    )

从写出的demo.pkl文件中还原对象:

# 序列化并写出到pkl文件
with open('./demo.pkl', 'rb') as d:
    restore_demo = dill.load(d)
restore_demo

2.2 增强功能

看完了dill的基础用法,下面我们来介绍其相对于pickle进行增强的特殊功能:

2.2.1 对lambda函数进行序列化

pickle可以对常规的函数进行序列化,但针对lambda函数则会报错,而使用dill就可以正常序列化:

2.2.2 保存解释器的会话状态

dill中另一项很实用的功能则是其支持将当前解释器的会话状态整个打包保存和还原,譬如下面的例子,利用dill.dump_session()保存当前解释器会话状态,在另一个独立的py脚本中再利用dill.load_session()就可以一步到位全部还原:

2.2.3 从序列化结果中还原源码

dill中另一个很强大的功能是其source模块可以从序列化结果中还原对象的源码,这在序列化的对象为函数时非常实用(注意目前此功能不可以在ipykernel中执行,因此下面的例子使用魔术命令直接执行外部py脚本):

相关文章
|
4月前
|
JSON 缓存 安全
Python 的其他应用: 解释什么是 Python 的 pickle 模块?
Python 的其他应用: 解释什么是 Python 的 pickle 模块?
50 0
|
22天前
|
存储 JSON JavaScript
python序列化: json & pickle & shelve 模块
python序列化: json & pickle & shelve 模块
|
1月前
|
JSON 缓存 安全
Python pickle 二进制序列化和反序列化 - 数据持久化
Python pickle 二进制序列化和反序列化 - 数据持久化
39 0
|
3月前
|
JSON 安全 数据格式
详解python pickle中的反序列化漏洞
今天我们来聊聊Python里的反序列化攻击。先来看看什么是序列化和反序列化。简单来说,序列化就是把数据结构转换成字节流,这样我们就可以把数据保存到文件里或者通过网络传输。反序列化则是把这些字节流再转换回原来的数据结构。 在Python里,常用的模块之一就是Pickle。它可以帮我们很方便地进行序列化和反序列化操作。比如,你可以把一个复杂的Python对象序列化保存下来,等需要用的时候再反序列化回来。 反序列化攻击的概述 反序列化过程有漏洞:如果我们反序列化了一个不可信的数据源,那就可能引发反序列化攻击。攻击者可以在序列化的数据里嵌入恶意代码,当你反序列化这个数据时,这些恶意代码就会被执
|
4月前
|
存储 编解码 Python
初出茅庐,python模块篇:pickle模块和pathlib模块(太过详细,篇幅较长)_python文件操作模块有pickle模块
初出茅庐,python模块篇:pickle模块和pathlib模块(太过详细,篇幅较长)_python文件操作模块有pickle模块
|
4月前
|
存储 JSON JavaScript
Python中的JSON与Pickle模块:数据序列化和反序列化的利器
在Python编程中,数据的序列化和反序列化是经常遇到的操作。序列化是将数据结构或对象状态转换为可以存储或传输的格式的过程,而反序列化则是这个过程的逆操作,即将序列化的数据重新转换回原来的数据结构或对象状态。Python中的JSON和Pickle模块就是实现数据序列化和反序列化的强大工具。
|
11月前
|
存储 自然语言处理 Linux
Python标准库分享之存储对象 (pickle包,cPickle包)
Python标准库分享之存储对象 (pickle包,cPickle包)
|
存储 JSON JavaScript
【从零学习python 】55.Python中的序列化和反序列化,JSON与pickle模块的应用
【从零学习python 】55.Python中的序列化和反序列化,JSON与pickle模块的应用
92 0
|
存储 JSON 数据格式
【Python标准库】Pickle库与序列化
【Python标准库】Pickle库与序列化