dill.dump的fmode参数无效果,生成的pickle文件完全相同
问题分析与解决
你的问题核心是对dill.dump()的fmode参数作用场景理解有误——这个参数仅针对文件对象的序列化行为生效,对普通类/对象的序列化没有任何影响,这也是你生成的四个pickle文件完全相同的原因。
一、fmode的实际作用
fmode参数是dill用来控制打开的文件句柄/文件对象的序列化方式,不同取值对应三种行为:
HANDLE_FMODE:序列化文件的系统句柄,反序列化时依赖原环境的文件状态,跨环境大概率失效FILE_FMODE:序列化文件的路径,反序列化时会尝试重新打开该路径下的文件CONTENTS_FMODE:直接序列化文件的内容,反序列化时会生成一个包含该内容的类文件对象,不依赖原文件的存在,适合跨环境场景
二、你的测试用例问题
你序列化的是AddTwoIntegers类,这个对象和文件操作完全无关,fmode参数不会参与到序列化逻辑中,所以无论设置哪种fmode,最终的pickle内容都是一样的。
三、正确的测试示例
要验证fmode的效果,需要序列化打开的文件对象,示例代码如下:
import dill as pickle from dill import CONTENTS_FMODE, FILE_FMODE, HANDLE_FMODE # 先创建一个测试文件 with open("test.txt", "w") as f: f.write("Hello, dill!") # 用不同fmode序列化打开的文件对象 # 1. HANDLE_FMODE:序列化句柄 with open('file_fmode_handle.pkl', 'wb') as f: with open("test.txt", "r") as file_obj: pickle.dump(file_obj, f, fmode=HANDLE_FMODE) # 2. FILE_FMODE:序列化文件路径 with open('file_fmode_file.pkl', 'wb') as f: with open("test.txt", "r") as file_obj: pickle.dump(file_obj, f, fmode=FILE_FMODE) # 3. CONTENTS_FMODE:序列化文件内容 with open('file_fmode_contents.pkl', 'wb') as f: with open("test.txt", "r") as file_obj: pickle.dump(file_obj, f, fmode=CONTENTS_FMODE)
此时生成的三个pickle文件会有明显差异:
file_fmode_handle.pkl体积最小,仅包含句柄信息file_fmode_file.pkl会包含文件路径字符串file_fmode_contents.pkl体积最大,包含了test.txt里的全部内容
四、补充说明
dill文档中提到的“跨环境序列化和反序列化”,正是针对文件对象的场景——比如你需要将一个文件的内容传递到另一个没有原文件的环境,使用CONTENTS_FMODE就能直接把内容打包进pickle,无需依赖外部文件。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

