如何将一个 class pickle, 在缺失源码的情况下也能 unpickle 后生成实例

2023-02-03 15:55:31 +08:00
 justou

我用一些伪代码来说明这个问题, 假设有如下目录结构

├── main.py
├── media
│   ├── __init__.py
│   ├── ....
│   └── media.py
└── player
    ├── __init__.py
    ├── ....
    └── player.py

main.py 中:

from media.media import Media
from player.player import Player

p = Player()
m = Media()
p(m)

Media, Player的实现依赖于很多自己写的模块以及第三方模块的类和函数, 想把MediaPlayer类 pickle 到文件,

with open('media.pkl', 'wb') as f, open('player.pkl', 'wb') as g:
	my_super_pickle.dump(Media, f)
	my_super_pickle.dump(Player, g)

缺失源码情况下也能 unpickle 出完整的类用于生成实例正常使用:

# 没有以上实现源码, 只有 media.pkl, 'player.pkl' 和第三方依赖的 python 环境
with open('media.pkl', 'rb') as f, open('player.pkl', 'rb') as g:
	Media = my_super_pickle.load(f)
	Player = my_super_pickle.load(g)
    
p = Player()
m = Media()
p(m)

所以my_super_pickle 需要将项目下与 Media 和 Player 所有相关的依赖都以某种方式 pickle, 且忽略掉不在该目录下的第三方依赖.

目的: 发布一些自带源码的数据包, 数据包中的数据是主角, 源码是解释数据的手段. 在后续源码更新后, 旧的数据包也能正常使用——旧的数据和旧的源码绑定在一起,新的数据跟新的源码绑定在一起.

请问各位有什么好的解决方案?

1367 次点击
所在节点    Python
1 条回复
justou
2023-02-03 16:17:21 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/912921

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX