>> 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

    文章

    564

    浏览量

    39910
  • 字典
    +关注

    关注

    0

    文章

    13

    浏览量

    7672
  • python
    +关注

    关注

    51

    文章

    4678

    浏览量

    83486
收藏 人收藏

    评论

    相关推荐

    古文翻译字典

    古文翻译字典 
    发表于 10-07 10:50

    新版中九字典算法替换工具,支持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

    PC产品设计中的模组电源

    我们都知道PC电源产品的设计有原生线材、半模组线材以及模组线材三种不同的方案,其中原生线材设计的多为入门级和主流级产品,而中高端产品则多为半模组或者模组设计,旗舰级电源产品则几乎都
    发表于 10-10 15:14

    请问系统数据字典怎么设计?

    就是比如学历[小学、初中、高中、大学...]、民族[汉族、回族、满族...]类似的数据结构;比如有一个主表用户表user,学历、民族需要在字典表中取值,有几个问题想了解下大家是什么样的思路:1.主表
    发表于 03-26 07:56

    稀疏表示和字典学习是什么

    稀疏表示和字典学习的简单理解
    发表于 08-27 14:44

    python——元组,集合,字典

    python——元组,集合,字典(tuple,set,dict)
    发表于 05-22 12:30

    串口通信相关资料分享

    设备通信串口通信(三)介绍完了串口通信的基础和通信时序,已经可以实现数据的传输。本文要介绍的通信协议是通信双方对传输数据格式的一种规则和约定,相当于机器和机器之间交流的语言。有了通信协议,不仅
    发表于 07-02 06:45

    python字典

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

    python合并字典的 7 种方法

    1、最简单的原地更新字典对象内置了一个 update 方法,用于把另一个字典更新到自己身上。>>> profile = {"name": "
    发表于 04-08 15:11

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

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

    python字典是什么

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

    Python序列的字典类型介绍

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