python munch库的使用解析


Posted in Python onMay 25, 2021

字典是 Python 中基础的数据结构之一,字典的使用,可以说是非常的简单粗暴,但即便是这样一个与世无争的数据结构,仍然有很多人 "看不惯它" 。
也许你并不觉得,但我相信,你看了这篇文章后,一定会和我一样,对原生字典开始有了偏见。
我举个简单的例子吧
当你想访问字典中的某个 key 时,你需要使用字典特定的访问方式,而这种方式需要你键入 一对中括号 还有 一对引号

>>> profile = dict(name="iswbm")
>>> profile
{'name': 'iswbm'}
>>> profile["name"]
'iswbm'

是不是开始觉得忍无可忍了?
如果可以像调用对象属性一样使用 . 去访问 key 就好了,可以省去很多多余的键盘击入,就像这样子

>>> profile.name
'iswbm'

是的,今天这篇文章就是跟大家分享一种可以直接使用 . 访问和操作字典的一个黑魔法库 -- munch。

1. 安装方法

使用如下命令进行安装

$ python -m pip install munch

2. 简单示例

munch 有一个 Munch 类,它继承自原生字典,使用 isinstance 可以验证

>>> from munch import Munch
>>> profile = Munch()
>>> isinstance(profile, dict)
True
>>>

并实现了点式赋值与访问,profile.name 与 profile['name'] 是等价的

>>> profile.name = "iswbm"
>>> profile.age = 18
>>> profile
Munch({'name': 'iswbm', 'age': 18})
>>>
>>> profile.name
'iswbm'
>>> profile["name"]
'iswbm'

3. 兼容字典的所有操作

本身 Munch 继承自 dict,dict 的操作也同样适用于 Munch 对象,不妨再来验证下
首先是:增删改查

# 新增元素
>>> profile["gender"] = "male"
>>> profile
Munch({'name': 'iswbm', 'age': 18, 'gender': 'male'})

# 修改元素
>>> profile["gender"] = "female"
>>> profile
Munch({'name': 'iswbm', 'age': 18, 'gender': 'female'})

# 删除元素
>>> profile.pop("gender")
'female'
>>> profile
Munch({'name': 'iswbm', 'age': 18})
>>>
>>> del profile["age"]
>>> profile
Munch({'name': 'iswbm'})

再者是:一些常用方法

>>> profile.keys()
dict_keys(['name'])
>>>
>>> profile.values()
dict_values(['iswbm'])
>>>
>>> profile.get('name')
'iswbm'
>>> profile.setdefault('gender', 'male')
'male'
>>> profile
Munch({'name': 'iswbm', 'gender': 'male'})

4. 设置返回默认值

当访问一个字典中不存在的 key 时,会报 KeyError 的错误

>>> profile = {}
>>> profile["name"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'name'

对于这种情况,通常我们会使用 get 来规避

>>> profile = {}
>>> profile.get("name", "undefined")
'undefined'

当然你在 munch 中仍然可以这么用,不过还有一种更好的方法:使用 DefaultMunch,它会在你访问不存在的 key 时,给你返回一个设定好的默认值

>>> from munch import DefaultMunch
>>> profile = DefaultMunch("undefined", {"name": "iswbm"})
>>> profile
DefaultMunch('undefined', {'name': 'iswbm'})
>>> profile.age
'undefined'
>>> profile
DefaultMunch('undefined', {'name': 'iswbm'})

5. 工厂函数自动创建key

上面使用 DefaultMunch 仅当你访问不存在的 key 是返回一个默认值,但这个行为并不会修改原 munch 对象的任何内容。
若你想访问不存在的 key 时,自动触发给原 munch 中新增你想要访问的 key ,并为其设置一个默认值,可以试一下 DefaultFactoryMunch 传入一个工厂函数。

>>> from munch import DefaultFactoryMunch
>>> profile = DefaultFactoryMunch(list, name='iswbm')
>>> profile
DefaultFactoryMunch(list, {'name': 'iswbm'})
>>>
>>> profile.brothers
[]
>>> profile
DefaultFactoryMunch(list, {'name': 'iswbm', 'brothers': []})

6. 序列化的支持

Munch 支持序列化为 JSON 或者 YAML 格式的字符串对象
转换成 JSON

>>> from munch import Munch
>>> munch_obj = Munch(foo=Munch(lol=True), bar=100, msg='hello')
>>>
>>> import json
>>> json.dumps(munch_obj)
'{"foo": {"lol": true}, "bar": 100, "msg": "hello"}'

转换成 YAML

>>> from munch import Munch
>>> munch_obj = Munch(foo=Munch(lol=True), bar=100, msg='hello')
>>> import yaml
>>> yaml.dump(munch_obj)
'!munch.Munch\nbar: 100\nfoo: !munch.Munch\n  lol: true\nmsg: hello\n'
>>>
>>> print(yaml.dump(munch_obj))
!munch.Munch
bar: 100
foo: !munch.Munch
  lol: true
msg: hello

>>>

建议使用 safe_dump 去掉 !munch.Munch

>>> print(yaml.safe_dump(munch_obj))
bar: 100
foo:
  lol: true
msg: hello

以上就是关于 munch 的使用全解,替换原生字典绝无问题,munch 的进一步封装使得数据的访问及操作更得更加 Pythonic 了,希望有一天这个特性能够体现在原生的字典上。

到此这篇关于python munch库的使用解析的文章就介绍到这了,更多相关python munch库的使用内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
发布你的Python模块详解
Sep 15 Python
python 随机数使用方法,推导以及字符串,双色球小程序实例
Sep 12 Python
numpy实现合并多维矩阵、list的扩展方法
May 08 Python
numpy.ndarray 交换多维数组(矩阵)的行/列方法
Aug 02 Python
Python异常处理操作实例详解
Aug 28 Python
对Python实现累加函数的方法详解
Jan 23 Python
python实现贪吃蛇小游戏
Mar 21 Python
基于python历史天气采集的分析
Feb 14 Python
Python3 合并二叉树的实现
Sep 30 Python
python中文分词库jieba使用方法详解
Feb 11 Python
jupyter notebook读取/导出文件/图片实例
Apr 16 Python
django为Form生成的label标签添加class方式
May 20 Python
python调试工具Birdseye的使用教程
浅谈Python numpy创建空数组的问题
May 25 #Python
python实现语音常用度量方法的代码详解
python基础学习之生成器与文件系统知识总结
May 25 #Python
Python实战之实现简易的学生选课系统
May 25 #Python
python 如何用terminal输入参数
May 25 #Python
python 命令行传参方法总结
May 25 #Python
You might like
PHP防止post重复提交数据的简单例子
2014/06/07 PHP
CI框架AR操作(数组形式)实现插入多条sql数据的方法
2016/05/18 PHP
php微信公众号开发之关键词回复
2018/10/20 PHP
PHP应用跨时区功能的实现方法
2019/03/21 PHP
JavaScript 模仿vbs中的 DateAdd() 函数的代码
2007/08/13 Javascript
json跟xml的对比分析
2008/06/10 Javascript
JavaSciprt中处理字符串之sup()方法的使用教程
2015/06/08 Javascript
初步认识JavaScript函数库jQuery
2015/06/18 Javascript
使用jQuery监听扫码枪输入并禁止手动输入的实现方法(推荐)
2017/03/21 jQuery
微信小程序开发背景图显示功能
2018/08/08 Javascript
利用原生JS实现data方法示例代码
2019/05/28 Javascript
[40:19]2018完美盛典CS.GO表演赛
2018/12/17 DOTA
将Django框架和遗留的Web应用集成的方法
2015/07/24 Python
windows下ipython的安装与使用详解
2016/10/20 Python
Python函数any()和all()的用法及区别介绍
2018/09/14 Python
django的settings中设置中文支持的实现
2019/04/28 Python
numpy.random模块用法总结
2019/05/27 Python
Python发展史及网络爬虫
2019/06/19 Python
python正则-re的用法详解
2019/07/28 Python
python爬虫 urllib模块反爬虫机制UA详解
2019/08/20 Python
Django admin.py 在修改/添加表单界面显示额外字段的方法
2019/08/22 Python
python调用私有属性的方法总结
2020/07/24 Python
几款Python编译器比较与推荐(小结)
2020/10/15 Python
html5拍照功能实现代码(htm5上传文件)
2013/12/11 HTML / CSS
意大利领先的奢侈品在线时装零售商:MCLABELS
2020/10/13 全球购物
《金钱的魔力》教学反思
2014/02/24 职场文书
简易版租房协议书范本
2014/10/13 职场文书
软弱涣散基层党组织整改方案
2014/10/25 职场文书
村干部任职承诺书
2015/01/21 职场文书
2015学习委员工作总结范文
2015/04/03 职场文书
患者身份识别制度
2015/08/06 职场文书
班级元旦晚会开幕词
2016/03/04 职场文书
pytorch查看网络参数显存占用量等操作
2021/05/12 Python
nginx实现动静分离的方法示例
2021/11/07 Servers
详细介绍Java中的CyclicBarrier
2022/04/13 Java/Android
解决Oracle数据库用户密码过期
2022/05/11 Oracle