先看一段代码:

user = dict(name="brainliao", age=32)
print(user["sex"])

运行结果如下:

user这个字典中没有sex这个key,所以访问user[“sex”]会报KeyError这个错

有如下3中解决方式:

1、调用get(k, default)方法

user = dict(name="brainliao", age=32)
print(user.get("sex", "男"))

结果如下:

2、用collections.defaultdict()方法

import collections
user = collections.defaultdict(str)
print(user["sex"])
结果打印出空字符串
 
这个方法的含义在于指定了字典中的所有values均为字符串,并默认值为空字符串。所有调用user["sex"]不会报错。但是这种方法有局限性,就是不适合不同的key对应不用类型的value的字典定义。
 
 
3、重定义__missing__方法
 
class User(dict):

    def __missing__(self,key):
print("调用了 User的__missing__方法")
return "__missing__" def __getitem__(self, item):
print("调用User 类的 __getitem__方法")
return super(User, self).__getitem__(item) def get(self, k, d=None):
print("调用User 类的 get 方法")
return super(User, self).get(k, d) user = User(name="brianliao", age=32)
print(user["sex"])
 
打印结果如下:

调用User 类的 __getitem__方法
调用了 User的__missing__方法
__missing__

从打印的结果可以看出,获取字典key对应的值时,会去调用内部的__getitem__方法,而当__getitem__没找到对应的key时,会调用__missing__方法。最终返回结果。

总结,最简单、最直接的方式还是使用第一种方式,第二种方式具有很大的局限性,第三种方式在一些特殊情况下很合适使用。

最新文章

  1. iOS删除本地文件
  2. [转]make: 警告:检测到时钟错误。您的创建可能是不完整的。
  3. jmeter随笔(5)--断言中正则表达式的特殊字符问题和中文乱码显示问号的问题
  4. 初识shell脚本
  5. 图像处理简单实例[OpenCV 笔记1]
  6. OMCS的语音视频带宽占用
  7. 触发TreeView的TreeNodeCheckChanged事件
  8. 解压版mysql安装--windows系统
  9. 运用JavaScript构建你的第一个Metro式应用程序(on Windows 8)(一)
  10. 【Android基础】listview控件的使用(4)-----自定义布局的listview的使用
  11. Django之路:QuerySet API,后台和表单
  12. A tutorial that will show you how to build an instant messaging app with Sinch.
  13. Brief introduction to Java String Split 【简单介绍下Java String Split】
  14. [Redis源码阅读]dict字典的实现
  15. Python简单爬虫获取岗位招聘人数
  16. RVIZ实现模拟控制小车
  17. navigator 判断移动端是Android还是iOS
  18. 什么是 BULK INSERT
  19. Spark RDD、DataFrame和DataSet的区别
  20. 在唯一密钥属性“fileExtension”设置为“.log”时,无法添加类型为“mimeMap”的重复集合项

热门文章

  1. 从InitialContext获取数据源
  2. EXISTS运算符
  3. python正则表达式中的分组 group
  4. 主数据及其管理MDM
  5. BZOJ 1066 [SCOI2007]蜥蜴(最大流)
  6. 【贪心】Codeforces Round #407 (Div. 2) A. Anastasia and pebbles
  7. bzoj 3373: [Usaco2004 Mar]Lying Livestock 说谎的牲畜
  8. 简单的INI解析封装
  9. BZOJ 4028: [HEOI2015]公约数数列 分块
  10. Eclipse环境安装rust