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二分法实现实例
Nov 21 Python
python使用正则表达式匹配字符串开头并打印示例
Jan 11 Python
基于使用paramiko执行远程linux主机命令(详解)
Oct 16 Python
Python实现螺旋矩阵的填充算法示例
Dec 28 Python
使用Python+Splinter自动刷新抢12306火车票
Jan 03 Python
python计算两个数的百分比方法
Jun 29 Python
浅谈Python在pycharm中的调试(debug)
Nov 29 Python
Python3批量生成带logo的二维码方法
Jun 24 Python
Pytorch: 自定义网络层实例
Jan 07 Python
使用Python爬虫库requests发送表单数据和JSON数据
Jan 25 Python
python安装和pycharm环境搭建设置方法
May 27 Python
用python给csv里的数据排序的具体代码
Jul 17 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一些公用函数的集合
2008/03/27 PHP
php站内搜索关键词变亮的实现方法
2014/12/30 PHP
phpinfo无法显示的原因及解决办法
2019/02/15 PHP
docker-compose部署php项目实例详解
2019/07/30 PHP
PHP实现提高SESSION响应速度的几种方法详解
2019/08/09 PHP
浅谈JavaScript中面向对象技术的模拟
2006/09/25 Javascript
js动态设置div的值下例子
2013/10/29 Javascript
JavaScript黑洞数字之运算路线查找算法(递归算法)实例
2016/01/28 Javascript
详解AngularJS控制器的使用
2016/03/09 Javascript
纯js实现手风琴效果
2020/04/17 Javascript
简单的JS轮播图代码
2016/07/18 Javascript
Angular 2应用的8个主要构造块有哪些
2016/10/17 Javascript
javascript实现圣旨卷轴展开效果(代码分享)
2017/03/23 Javascript
JavaScript中in和hasOwnProperty区别详解
2017/08/04 Javascript
通过vue-router懒加载解决首次加载时资源过多导致的速度缓慢问题
2018/04/08 Javascript
JS猜数字游戏实例讲解
2020/06/30 Javascript
js和jquery判断数据类型的4种方法总结
2020/08/28 jQuery
使用Django的模版来配合字符串翻译工作
2015/07/27 Python
Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
2018/02/18 Python
利用Python代码实现数据可视化的5种方法详解
2018/03/25 Python
Tensorflow使用支持向量机拟合线性回归
2018/09/07 Python
python中for循环变量作用域及用法详解
2019/11/05 Python
python如何使用jt400.jar包代码实例
2019/12/20 Python
Python程序控制语句用法实例分析
2020/01/14 Python
Pytorch学习之torch用法----比较操作(Comparison Ops)
2020/06/28 Python
基于python实现MQTT发布订阅过程原理解析
2020/07/27 Python
Python实现小黑屋游戏的完整实例
2021/01/06 Python
校园奶茶店创业计划书
2014/01/23 职场文书
商业项目策划方案
2014/06/05 职场文书
宣传活动总结范文
2014/07/01 职场文书
不服从公司安排检讨书
2014/09/24 职场文书
廉洁自律证明
2015/06/24 职场文书
英语版自我评价,35句话轻松搞定
2019/10/08 职场文书
vue中三级导航的菜单权限控制
2021/03/31 Vue.js
mongodb清除连接和日志的正确方法分享
2021/09/15 MongoDB
解决MySQL添加新用户-ERROR 1045 (28000)的问题
2022/03/03 MySQL