我查看了泡菜文档,但我不明白泡菜在哪里有用。
泡菜的一些常见用例是什么?
我遇到的一些用途:
1) 将程序的状态数据保存到磁盘,以便它可以在重新启动时从中断的地方继续(持久性)
2) 在多核或分布式系统中通过 TCP 连接发送 python 数据(编组)
3)将python对象存储在数据库中
4) 将任意 python 对象转换为字符串,以便它可以用作字典键(例如,用于缓存和记忆)。
最后一个存在一些问题——两个相同的对象可以被腌制并导致不同的字符串——甚至相同的对象被腌制两次也可能有不同的表示。这是因为泡菜可以包含引用计数信息。
为了强调@lunaryorn 的评论——你永远不应该从不受信任的来源解开字符串,因为精心制作的泡菜可以在你的系统上执行任意代码。例如参见https://blog.nelhage.com/2011/03/exploiting-pickle/
最小的往返示例..
>>> import pickle
>>> a = Anon()
>>> a.foo = 'bar'
>>> pickled = pickle.dumps(a)
>>> unpickled = pickle.loads(pickled)
>>> unpickled.foo
'bar'
编辑:但至于酸洗的实际例子的问题,也许酸洗最先进的使用(你必须深入挖掘源代码)是 ZODB: http ://svn.zope.org/
否则,PyPI 会提到几个: http ://pypi.python.org/pypi?:action=search&term=pickle&submit=search
我个人见过几个通过网络发送腌制对象的示例,作为一种易于使用的网络传输协议。
我在我的一个项目中使用过它。如果应用程序在运行期间被终止(它执行了一项冗长的任务并处理了大量数据),我需要保存整个数据结构并在应用程序再次运行后重新加载它。我为此使用了 cPickle,因为速度是至关重要的,而且数据量非常大。
对于您的数据结构和类,Pickle 就像“另存为..”和“打开..”。假设我想保存我的数据结构,以便它在程序运行之间保持不变。
保存:
with open("save.p", "wb") as f:
pickle.dump(myStuff, f)
加载:
try:
with open("save.p", "rb") as f:
myStuff = pickle.load(f)
except:
myStuff = defaultdict(dict)
现在我不必从头开始构建 myStuff,我可以从上次中断的地方继续。
对于初学者(就像我一样),在阅读官方文档时,真的很难理解为什么首先要使用 pickle 。这可能是因为文档暗示您已经知道序列化的全部目的。只有在阅读了序列化的一般描述之后,我才理解了这个模块的原因和它的常见用例。忽略特定编程语言的序列化的广泛解释可能会有所帮助: https ://stackoverflow.com/a/14482962/4383472 ,什么是序列化?, https://stackoverflow.com/a/3984483/4383472
添加一个真实的示例:Python 的Sphinx文档工具使用 pickle 来缓存已解析的文档和文档之间的交叉引用,以加快文档的后续构建。
我可以告诉你我使用它的用途,并且已经看到它用于:
这些是我至少使用它的那些
我在网页抓取期间使用酸洗,当时我想存储超过 8000k 的网址并希望尽快处理它们,所以我使用酸洗,因为它的输出质量非常高。
您可以轻松访问 url 和停止工作目录关键字的位置,也可以非常快速地获取 url 详细信息以恢复该过程。