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 相关文章推荐
在Django的模型中执行原始SQL查询的方法
Jul 21 Python
Python的Flask框架的简介和安装方法
Nov 13 Python
python入门教程之识别验证码
Mar 04 Python
python列表使用实现名字管理系统
Jan 30 Python
对django中foreignkey的简单使用详解
Jul 28 Python
Python在cmd上打印彩色文字实现过程详解
Aug 07 Python
python将字典列表导出为Excel文件的方法
Sep 02 Python
python selenium循环登陆网站的实现
Nov 04 Python
Python 解决OPEN读文件报错 ,路径以及r的问题
Dec 19 Python
python批量替换文件名中的共同字符实例
Mar 05 Python
如何基于Python Matplotlib实现网格动画
Jul 20 Python
Python爬虫抓取指定网页图片代码实例
Jul 24 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获取网页标题和内容函数(不包含html标签)
2014/02/03 PHP
PHP将两个关联数组合并函数提高函数效率
2014/03/18 PHP
PHP面向对象之后期静态绑定功能介绍
2015/05/18 PHP
PHP排序算法类实例
2015/06/17 PHP
PHP中使用OpenSSL生成证书及加密解密
2017/02/05 PHP
javascript工具库代码
2012/03/29 Javascript
JavaScript 对任意元素,自定义右键菜单的实现方法
2013/05/08 Javascript
Jquery EasyUI的添加,修改,删除,查询等基本操作介绍
2013/10/11 Javascript
javascript中负数算术右移、逻辑右移的奥秘探索
2013/10/17 Javascript
ie下$.getJSON出现问题的解决方法
2014/02/12 Javascript
jQuery图片切换插件jquery.cycle.js使用示例
2014/06/16 Javascript
简单易用的倒计时js代码
2014/08/04 Javascript
Bootstrap三种表单布局的使用方法
2016/06/21 Javascript
AngularJS中指令的四种基本形式实例分析
2016/11/22 Javascript
javascript 实现文本使用省略号替代(超出固定高度的情况)
2017/02/21 Javascript
JavaScript中创建对象的7种模式详解
2017/02/21 Javascript
jQuery实现的简单获取索引功能示例
2018/06/04 jQuery
jQuery点击页面其他部分隐藏下拉菜单功能
2018/11/27 jQuery
JS+HTML5 canvas绘制验证码示例
2018/12/05 Javascript
python生成指定尺寸缩略图的示例
2014/05/07 Python
Python搭建FTP服务器的方法示例
2018/01/19 Python
windows下pycharm安装、创建文件、配置默认模板
2018/07/31 Python
python将时分秒转换成秒的实例
2019/12/07 Python
Pycharm debug调试时带参数过程解析
2020/02/03 Python
Django静态资源部署404问题解决方案
2020/05/11 Python
python requests库的使用
2021/01/06 Python
你可能不熟练的十个前端HTML5经典面试题
2018/07/03 HTML / CSS
台湾三立电视电商平台:电电购
2019/09/09 全球购物
在线实验室测试:HealthLabs.com
2020/05/03 全球购物
测控技术与仪器个人求职信范文
2013/12/30 职场文书
给女朋友的道歉信
2014/01/10 职场文书
学雷锋先进个人事迹
2014/05/26 职场文书
自动化专业大学生职业生涯规划范文:爱拚才会赢
2014/09/12 职场文书
大学生自荐信范文
2015/03/05 职场文书
Django与数据库交互的实现
2021/06/03 Python
利用Python实现翻译HTML中的文本字符串
2022/06/21 Python