请教一个关于__missing__方法的问题

2017-10-23 19:18:42 +08:00
 saximi
在网上看到这么一道问题。当给定以下字典的子类,下面的代码能运行么,为什么? 
class D(dict): 
        def __missing__(self,key): 
                return[] 

d=D() 
d['f']=12 


网上给出的答案是可以运行,因为当 key 缺失时,执行 DefaultDict 类,字典的实例将自动实例化这个数列。 
但是,我自己试着下了下面的代码,结果发现也能运行,所以不是很理解上面答案想说明什么,以及上面这道题目想考察的点是什么?恳请大家指点,感谢 

class E(dict): 
        pass 

e=E() 
e['f']=13 
3336 次点击
所在节点    Python
9 条回复
jmc891205
2017-10-23 20:25:11 +08:00
不知道它想考察什么
只有从字典里取值的时候才会有 key 缺失的情况。。。
n329291362
2017-10-23 20:25:37 +08:00
??
d['f']=12 难道不是赋值吗
n329291362
2017-10-23 20:28:01 +08:00
你直接 打印 e['f'] 就会报错了 d['f']的话会显示 []
flaneurse
2017-10-23 21:01:27 +08:00
有时候为了方便起见,就算某个键在映射里不存在,希望在通过这个键读取值的时候能得到一个默认值。有两个途径能帮我们达到这个目的,一个是通过 defaultdict,另一个是给自己定义一个 dict 的子类,然后在子类中实现__missing__ 方法。
saximi
2017-10-23 21:50:13 +08:00
@n329291362
@flaneurse 非常感谢!
zhusimaji
2017-10-23 23:32:42 +08:00
楼主有兴趣可以深究一下 missing 在哪调用? get 方法也可以获取值,但是为啥不同于 getitem 函数?四楼基本上解决了楼主的问题
hcnhcn012
2017-10-24 00:15:52 +08:00
https://docs.python.org/3/library/stdtypes.html#mapping-types-dict
文档里讲的很清楚啊,你那个是在 dict 中添加东西了,如果光是 e[‘ f ’],因为你没有写__missing__(),所以会抛出一个 keyerror,如果有__missing__(),那就返回或者抛出你在 missing 里写东西啊,其实还有一种简单的方法,就是 get(key[, default]),如果找不到 key 就返回 default,默认是 None。一个简单的字典缓存装饰器就可以用:
def buffer(fn):
cache = {}
miss = object()

@wraps(fn)
def wrapper(*args):
result = cache.get(args, miss)
if result is miss:
result = fn(*args)
cache[args] = result
return result

return wrapper
saximi
2017-10-24 20:11:23 +08:00
@zhusimaji 谢谢指点,我专门去查了__missing__、__get__和__getitem__的说明,涨知识了!
saximi
2017-10-24 20:17:06 +08:00
@hcnhcn012 谢谢指点!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/400020

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX