Python小酷库系列:5个常用的dict属性化访问扩展库
5个常用的dict属性化访问扩展库
- 嵌套结构
- 高级功能
- 性能
- 综合建议
在前面我们详细讲解了Box和Munch这两个dict属性化访问的扩展库,总体而言它们主要用于提升配置文件数据、JSON对象数据的可读性,减少了代码中双引号。在这一领域中还有dotmap、addict 和 easydict等,本节我们就来对比一下这五个dict属性化访问扩展库。
鉴于 box、munch、dotmap、addict 和 easydict在基本使用上都比较接近,在此不再赘述,本节主要考察它们在嵌套结构、高级功能和性能上的差异,以帮助我们在实际使用中做出合适的选择。
嵌套结构
功能 | addict | munch | box | dotmap | easydict |
---|---|---|---|---|---|
自动解析嵌套 | ✅ | ✅ | ✅ | ✅ | ✅ |
自动创建嵌套 | ✅ d.user.name = “Alice” | ❌ d[‘user’] = Munch(); d.user.name = “Alice” | ✅ Box(default_box=True) | ✅ d.user.name = “Alice” | ❌ 需手动设置子项为 EasyDict |
浅拷贝 | ✅ | ✅ | ✅ | ✅ | ✅ |
深拷贝 | ❌ | ❌ | ✅ merge_update | ❌ | ❌ |
高级功能
功能 | addict | munch | box | dotmap | easydict |
---|---|---|---|---|---|
默认值(auto create) | ✅ | ❌ | ✅ default_box | ✅ | ❌ |
深度合并 | ❌ | ⚠️ 有限支持 | ✅ merge_update | ❌ | ❌ |
属性与键冲突保护 | ❌ | ✅ | ✅ | ❌ | ❌ |
JSON / YAML 友好 | ❌ | ✅ | ✅ | ❌ | ❌ |
冻结/只读模式 | ❌ | ❌ | ✅(可配置) | ❌ | ❌ |
性能
使用 timeit 进行 .user.name 和[‘user’][‘name’] 的性能测试(百万次访问)(单位:秒)
库 | 原生 dict | addict | munch | box | dotmap | easydict |
---|---|---|---|---|---|---|
访问时间 | 0.07s | ~0.40s | ~0.30s | ~0.60s | ~0.35s | ~0.25s |
赋值时间 | 0.08s | ~0.45s | ~0.35s | ~0.65s | ~0.38s | ~0.28s |
嵌套创建 | ❌ | ✅ 快 | ❌ | ✅ 中 | ✅ 中 | ❌ |
综合建议
在进行本次对比时,以上五个扩展库在pypi上的最后release时间分别为:
- box 2025
- easydict 2024
- munch 2023
- dotmap 2022
- addict 2020
考虑到用新不用旧的原则以及上述综合因素,建议一般情况下可以使用box
,对性能有一定要求时,可以选用easydict
。