大家好,我是明哥,今天来聊聊字典相关的话题。字典是Python中的基本数据结构之一。字典的使用可以说是非常简单粗暴,但即便是这样一个毫无争议的数据结构,还是有很多人“看不懂”。或许你不这么认为,但我相信看完这篇文章,你会和我一样开始对原生词典产生偏见。让我给你一个简单的例子。当你想访问字典中的一个键时,你需要使用字典特定的访问方法,这需要你键入一对方括号和一对引号>>>profile=dict(name="iswbm")>>>profile{'name':'iswbm'}>>>profile["name"]'iswbm'开始觉得受不了了?如果它可以像调用对象属性一样使用。去accesskey就可以了,可以省去很多额外的键盘敲击,像这样>>>profile.name'iswbm'是的,今天的文章就是给大家分享一个可以直接使用的。访问和操作字典Blackmagiclibrary--munch。1、安装方法使用以下命令安装$python-mpipinstallmunch2。一个简单的例子munch有一个Munch类,它继承了原来的字典,可以通过isinstance>>>frommunchimportMunch>>>profile=Munch()>>>isinstance(profile,dict)True>>>验证并实现点分配和访问,profile.name和profile['name']是等价的>>>profile.name="iswbm">>>profile.age=18>>>profileMunch({'name':'iswbm','age':18})>>>>>>profile.name'iswbm'>>>profile["name"]'iswbm'3.兼容字典的所有操作Munch本身继承自dict,对dict的操作也是适用于蒙克对象。您不妨再次验证一下。name':'iswbm','age':18,'gender':'male'})#修改元素>>>profile["gender"]="female">>>profileMunch({'name':'iswbm','age':18,'gender':'female'})#删除元素>>>profile.pop("gender")'female'>>>profileMunch({'name':'iswbm','age':18})>>>>>>>delprofile["age"]>>>profileMunch({'name':'iswbm'})此外:一些常用的方法>>>profile.keys()dict_keys(['name'])>>>>>>profile.values()dict_values(['iswbm'])>>>>>>profile.get('name')'iswbm'>>>profile.setdefault('gender','male')'male'>>>>profileMunch({'name':'iswbm','gender':'male'})4.设置返回默认值当访问字典中不存在的key时,会报KeyError错误>>>profile={}>>>profile["name"]traceback(mostrecentcalllast):File"",line1,inKeyError:'name'这种情况,我们通常使用get来避免>>>profile={}>>>profile.get("name","undefined")'undefined'当然你仍然可以在munch中使用这个,但是有一个更好的方法:使用DefaultMunch,当你访问一个不存在的键时它会返回给你一个集合>的默认值>>frommunchimportDefaultMunch>>>profile=DefaultMunch("undefined",{"name":"iswbm"})>>>profileDefaultMunch('undefined',{'name':'iswbm'})>>>profile.age'未定义'>>>profileDefaultMunch('undefined',{'name':'iswbm'})5.factory函数自动创建上面的key,只有当你访问一个不存在的key时,才会使用DefaultMunch返回一个默认值,但是这个行为不会修改任何内容原始munch对象的如果你想访问一个不存在的key,它会自动触发将你想要访问的key添加到原始munch中,并为其设置一个默认值。您可以尝试使用DefaultFactoryMunch来传入工厂函数。>>>frommunchimportDefaultFactoryMunch>>>profile=DefaultFactoryMunch(list,name='iswbm')>>>profileDefaultFactoryMunch(list,{'name':'iswbm'})>>>>>>profile.brothers[]>>>profileDefaultFactoryMunch(list,{'name':'iswbm','brothers':[]})6.序列化支持Munch支持序列化成JSON或者YAML字符串对象转换成JSON:>>>frommunchimportMunch>>>munch_obj=Munch(foo=Munch(lol=True),bar=100,msg='hello')>>>>>>importjson>>>json.dumps(munch_obj)'{"foo":{"lol":true},"bar":100,"msg":"hello"}'进入YAML:>>>frommunchimportMunch>>>munch_obj=Munch(foo=Munch(lol=True),bar=100,msg='hello')>>>importyaml>>>yaml.dump(munch_obj)'!munch.Munch\nbar:100\nfoo:!munch.Munch\nlol:true\nmsg:hello\n'>>>>>>print(yaml.dump(munch_obj))!munch.Munchbar:100foo:!munch.Munchlol:truemsg:hello>>>建议使用safe_dump删除!munch.Munch:>>>print(yaml.safe_dump(munch_obj))bar:100foo:lol:truemsg:hello以上就是munch使用的完整解决方案。替换原来的字典是没有问题的。munch的进一步封装使得数据访问和操作更加Python化,希望有朝一日能在原生字典中体现这一特性