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正则分析nginx的访问日志
Jan 17 Python
Python实现的选择排序算法示例
Nov 29 Python
详解如何管理多个Python版本和虚拟环境
May 10 Python
使用python的pandas为你的股票绘制趋势图
Jun 26 Python
Django使用中间件解决前后端同源策略问题
Sep 02 Python
python英语单词测试小程序代码实例
Sep 09 Python
Python坐标线性插值应用实现
Nov 13 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
Sep 29 Python
Python中logging日志的四个等级和使用
Nov 17 Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
Jan 08 Python
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
Apr 12 Python
Python中使用tkFileDialog实现文件选择、保存和路径选择
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获取参数的几种方法总结
2014/02/18 PHP
yii实现创建验证码实例解析
2014/07/31 PHP
PHP实现即时输出、实时输出内容方法
2015/05/27 PHP
php PDO实现的事务回滚示例
2017/03/23 PHP
thinkPHP5框架实现基于ajax的分页功能示例
2018/06/12 PHP
[原创]站长必须要知道的javascript广告代码
2007/05/30 Javascript
测试JavaScript字符串处理性能的代码
2009/12/07 Javascript
jquery清空textarea等输入框实现代码
2013/04/22 Javascript
jquery实现图片灯箱明暗的遮罩效果
2013/11/15 Javascript
利用js正则表达式验证手机号,email地址,邮政编码
2014/01/23 Javascript
js截取中英文字符串、标点符号无乱码示例解读
2014/04/17 Javascript
jQuery插件jPaginate实现无刷新分页
2015/05/04 Javascript
Juery解决tablesorter中文排序和字符范围的方法
2015/05/06 Javascript
JS简单限制textarea内输入字符数量的方法
2015/10/14 Javascript
Node.js connect ECONNREFUSED错误解决办法
2016/09/15 Javascript
jQuery的$.extend 浅拷贝与深拷贝
2017/03/08 Javascript
vue v-model动态生成详解
2018/06/30 Javascript
vue从一个页面跳转到另一个页面并携带参数的解决方法
2019/08/12 Javascript
vue vantUI实现文件(图片、文档、视频、音频)上传(多文件)
2019/10/15 Javascript
vue+swiper实现左右滑动的测试题功能
2020/10/30 Javascript
python实现封装得到virustotal扫描结果
2014/10/05 Python
通过Python爬虫代理IP快速增加博客阅读量
2016/12/14 Python
Python 词典(Dict) 加载与保存示例
2019/12/06 Python
Python数据持久化存储实现方法分析
2019/12/21 Python
基于python3生成标签云代码解析
2020/02/18 Python
python 实现分组求和与分组累加求和代码
2020/05/18 Python
CSS3制作彩色进度条样式的代码示例分享
2016/06/23 HTML / CSS
TripAdvisor越南:全球领先的旅游网站
2017/09/21 全球购物
如何反序的迭代一个序列?how do I iterate over a sequence in reverse order
2012/02/04 面试题
给分销商的致歉信
2014/01/14 职场文书
大型车展策划方案
2014/02/01 职场文书
校园摄影活动策划方案
2014/02/05 职场文书
弘扬职业精神演讲稿
2014/03/20 职场文书
主管竞聘书范文
2014/03/31 职场文书
大学生军训自我鉴定范文
2014/09/18 职场文书
干部考察材料范文
2014/12/24 职场文书