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实现的生成自我描述脚本分享(很有意思的程序)
Jul 18 Python
Python实现把xml或xsl转换为html格式
Apr 08 Python
Python获取SQLite查询结果表列名的方法
Jun 21 Python
Python使用progressbar模块实现的显示进度条功能
May 31 Python
python 中字典嵌套列表的方法
Jul 03 Python
python机器学习之KNN分类算法
Aug 29 Python
Python从单元素字典中获取key和value的实例
Dec 31 Python
python实现统计文本中单词出现的频率详解
May 20 Python
pytest中文文档之编写断言
Sep 12 Python
Django对接支付宝实现支付宝充值金币功能示例
Dec 17 Python
手把手教你怎么用Python实现zip文件密码的破解
May 27 Python
Anaconda安装pytorch和paddle的方法步骤
Apr 03 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学习教程之第2天
2008/06/15 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
2015/09/14 PHP
PHP封装的page分页类定义与用法完整示例
2018/12/24 PHP
PHP getName()函数讲解
2019/02/03 PHP
PHP+MySQL实现在线测试答题实例
2020/01/02 PHP
IE FF OPERA都可用的弹出层实现代码
2009/09/29 Javascript
jQuery实现行文字链接提示效果的方法
2015/03/10 Javascript
jQuery插件Tmpl的简单使用方法
2015/04/27 Javascript
JS基于面向对象实现的放烟花效果
2015/05/07 Javascript
javascript实现控制的多级下拉菜单
2015/07/05 Javascript
JS实现从顶部下拉显示的带动画QQ客服特效代码
2015/10/24 Javascript
如何动态加载外部Javascript文件
2015/12/02 Javascript
深入学习jQuery Validate表单验证(二)
2016/01/18 Javascript
JS中parseInt()和map()用法分析
2016/12/16 Javascript
bootstrap输入框组使用方法
2017/02/07 Javascript
es6学习笔记之Async函数的使用示例
2017/05/11 Javascript
基于jquery trigger函数无法触发a标签的两种解决方法
2018/01/06 jQuery
webpack多入口文件页面打包配置详解
2018/01/09 Javascript
在vue中实现给每个页面顶部设置title
2020/07/29 Javascript
[02:23]DOTA2英雄基础教程 幻影长矛手
2013/12/09 DOTA
Python深入学习之对象的属性
2014/08/31 Python
Python实现方便使用的级联进度信息实例
2015/05/05 Python
python使用mysql数据库示例代码
2017/05/21 Python
Tensorflow的梯度异步更新示例
2020/01/23 Python
django haystack实现全文检索的示例代码
2020/06/24 Python
TripAdvisor斯洛伐克:阅读评论、比较价格和酒店预订
2018/04/25 全球购物
澳大利亚领先的武术用品和健身器材供应商:SMAI
2019/03/24 全球购物
Shopping happy life西班牙:以最优惠的价格提供最好的时尚配饰
2020/03/13 全球购物
银行门卫岗位职责
2013/12/29 职场文书
讲文明知礼仪演讲稿
2014/09/13 职场文书
农业局党的群众路线教育实践活动整改方案
2014/09/20 职场文书
“四风”问题整改措施和努力方向
2014/09/20 职场文书
八项规定自查自纠报告及整改措施
2014/10/26 职场文书
入队仪式主持词
2015/07/04 职场文书
Python 的 sum() Pythonic 的求和方法详细
2021/10/16 Python
Java中的Kotlin 内部类原理
2022/06/16 Java/Android