>> profile = dict(name= "iswbm" ) >>> profile { 'name' : 'iswbm' } >>> profile[ "name" ] 'is" />
0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于替换原生字典munch的使用全解

科技绿洲 来源:Python实用宝典 作者:Python实用宝典 2023-10-31 14:12 次阅读

字典是 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.nameprofile['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 "", line 1, in
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.Munchnbar: 100nfoo: !munch.Munchn lol: truenmsg: hellon'
>>>
>>> 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 了,希望有一天这个特性能够体现在原生的字典上。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据结构
    +关注

    关注

    3

    文章

    569

    浏览量

    40070
  • 字典
    +关注

    关注

    0

    文章

    13

    浏览量

    7693
  • python
    +关注

    关注

    55

    文章

    4764

    浏览量

    84353
收藏 人收藏

    评论

    相关推荐

    双面FPC制造工艺手册

    双面FPC制造工艺手册 FPC开料-双面FPC制造工艺     除部分材料以外,柔性印制板所用的
    发表于 03-17 10:50 1800次阅读

    新版中九字典算法替换工具,支持9月22号第六套算法

    有四个主要的功能:第一种:都不勾选时,能查看备份BIN有几套算法或字典的功能,并能具体查出是哪几套。第二种:只勾选“APP”时,能解压备份BIN中的APP。第三种,只勾选“替换”时,能进行算法或字典
    发表于 09-23 00:04

    澜启第6套字典算法替换工具

    中九澜启方案第6套字典算法替换工具(2011-9-22更新)请在替换前面打钩,然后将澜起文件拖入就OK了,文件保存在同一文件夹中
    发表于 09-23 13:24

    LabVIEW很全面很强大

    LabVIEW很全面很强大
    发表于 10-17 15:02

    单片机资料,详细

    单片机资料,希望大家有用
    发表于 07-20 08:48

    报文解析工具中的XML数据字典

    针对报文解析过程中存在的数据存储无序、查询和调用不便等问题,提出应用XML 数据字典进行数据存储的方案。根据给定的数据表,设计XML 形式的数据字典。实现XML 字典数据的
    发表于 03-28 09:38 36次下载

    电子白板术语

    电子白板术语 有效读取尺寸 是指电子白板可以书写使用的有效尺寸,在这个区域内可以任意书写
    发表于 02-08 13:43 399次阅读

    GPRS无线参数

    GPRS无线参数 作为移动通信系统,GSM网络中与无线设备和接口有关的参数的设置对于网络的服务性能如小区的覆盖、信令流量的分布、网络的业
    发表于 03-13 10:41 554次阅读

    TCP-IP协议学习教程

    TCP-IP协议学习教程,压缩包内一共30章
    发表于 08-24 18:31 0次下载

    一种多字典遥感图像超分辨算法

    ;然后,利用全局限制求取高分辨率图像的初始;最后,利用正交匹配追踪算法(OMP)对初始在小波域进行多字典稀疏求解。实验结果表明,相比基于单字典的超分辨重建算法,结果图像的主观视觉效
    发表于 12-03 10:55 2次下载

    解决不重复序列的排列问题的两个方法:递归和字典序法

    这篇文章主要介绍了解决不重复序列的排列问题的两个方法:递归和字典序法。
    的头像 发表于 03-29 11:19 6448次阅读
    解决不重复序列的<b class='flag-5'>全</b>排列问题的两个方法:递归和<b class='flag-5'>字典</b>序法

    CANOpen系列教程10_ 关于Canfestival及对象字典生成工具环境搭建

    CANOpen系列教程10_关于Canfestival及对象字典生成工具环境搭建
    的头像 发表于 03-06 15:52 1w次阅读

    计算机算术运算实现原理

    计算机算术运算实现原理
    发表于 03-26 14:04 5次下载

    python字典是什么

    python字典 字典(英文名 dict),它是由一系列的键值(key-value)对组合而成的数据结构。 字典中的每个键都与一个值相关联,其中 键,必须是可 hash 的值,如字符串,数值等 值
    的头像 发表于 02-23 16:54 3407次阅读

    Python序列的字典类型介绍

    字典 介绍 字典是“键值对”的无序可变序列,字典中的每个元素都是一个“键值对”,包含:“键对象”和“值对象”。 可以通过“键对象”实现快速获取、删除、更新对应的“值对象” 字典特点:
    的头像 发表于 03-08 17:35 1269次阅读
    Python序列的<b class='flag-5'>字典</b>类型介绍