srsly:一个把 Python 序列化问题打包解决的小工具

Python 序列化这件事,看起来简单,做起来烦。JSON、YAML、MessagePack、Pickle,每个库都有自己的 API,跨平台还经常出幺蛾子。编码问题、大文件问题、不同 Python 版本的兼容问题,坑一个接一个。

Explosion AI 这家公司在做 spaCy 和 Prodigy 的过程中,被这些问题折磨了多年。他们没有选择忍受,而是把所有序列化需求打包成了一个库:srsly。目前 481 Star,体量不大,但确实解决了实际问题。

正文顶部截图

它到底干了什么

srsly 的核心理念很简单:把市面上最好的序列化库包一层,提供统一的高阶 API。你不用再记 ujson、msgpack、ruamel.yaml 各自怎么用,一个库覆盖所有常见格式。

目前支持的格式包括:

  • JSON 和 JSONL
  • MessagePack
  • Pickle
  • YAML

底层用的是经过验证的库:ujson 负责 JSON,msgpack 负责二进制序列化,cloudpickle 处理复杂对象,ruamel.yaml 处理 YAML。没有自己造轮子,只是把轮子装到了一辆车上。

为什么需要这个库

很多人可能会问:Python 不是自带 json、pickle 吗?干嘛还要装第三方库?

这个问题 Explosion AI 自己也解释过。他们在做 spaCy 的过程中,发现标准库在跨版本、跨平台时会出现各种微妙的 bug。编码设置不对、locale 问题、大文件处理异常,这些坑分散在各个代码库里,维护起来很痛苦。

srsly 把这些经验全部封装进去。你用 srsly.read_json()srsly.write_json(),背后已经处理好了各种边界情况。对团队来说,这意味着更少的时间花在调试序列化 bug 上。

README区域截图

几个实用的设计

srsly 的 API 设计很直白,读和写成对出现:

  • json_dumps / json_loads:处理 JSON 字符串
  • read_json / write_json:直接操作文件
  • read_jsonl / write_jsonl:处理行式 JSON
  • msgpack_dumps / msgpack_loads:二进制序列化
  • yaml_dumps / yaml_loads:YAML 格式

每个函数参数都不多,接口干净。它还内置了 gzip 支持,write_gzip_jsonread_gzip_json 可以直接读写压缩文件,省掉你手动处理 gzip 的代码。

对数据科学用户有个额外好处:如果装了 numpy,numpy 对象可以直接序列化成 msgpack。装了 cupy 的话,cupy 对象会自动转 numpy 再序列化。这对处理机器学习模型的团队很实在。

安装和使用门槛

安装很简单,pip 直接装:

python -m pip install srsly

或者用 conda:

conda install -c conda-forge srsly

numpy 和 cupy 是可选依赖,按需安装就行。

用起来就是标准的 Python 库,import 之后直接调用。对熟悉 Python 的人来说几乎没有学习成本。

适合谁用

如果你只是偶尔读写几个 JSON 文件,标准库够用了。但如果你在以下场景,srsly 能省不少事:

  • 需要支持多种序列化格式的项目
  • 跨平台部署,对编码和兼容性有要求
  • 处理大量数据,需要 gzip 压缩和 JSONL 行式格式
  • 团队里有多人维护序列化相关代码,需要统一接口

总结

srsly 不是那种 flashy 的项目,没有花里胡哨的功能。它就是一个工程师把多年踩坑经验打包分享的产物。代码开源,MIT 协议, Explosion AI 持续维护。如果你被 Python 序列化的各种细节问题困扰过,这个库值得看一眼。

验打包分享的产物。代码开源,MIT 协议, Explosion AI 持续维护。如果你被 Python 序列化的各种细节问题困扰过,这个库值得看一眼。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐