ori*_*ral 0 python inheritance dictionary operator-overloading python-2.7
my_dict = {'a': 1}
Run Code Online (Sandbox Code Playgroud)
我希望my_dict['a']行为与my_dict.get('a')
那种方式相同,如果我这样做my_dict['b'],我不会引发错误但是获取默认None值,就像你从中得到它一样my_dict.get('b')
在my_dict = {'a': {'b': 2}}我可以做的情况下,my_dict['a']['b']它将充当my_dict.get('a').get('b')
这样做的my_dict['b'] = 2时候会一样的my_dict.update({'b': 2})
是否有可能这样做,我不必继承dict?
每次尝试访问不存在的键时,都可以使用collections.defaultdict()对象向字典添加新值:
>>> from collections import defaultdict
>>> d = defaultdict(lambda: None)
>>> d['a'] is None
True
>>> d
defaultdict(<function <lambda> at 0x10f463e18>, {'a': None})
Run Code Online (Sandbox Code Playgroud)
如果您不想添加密钥,请创建dict实现该__missing__方法的子类:
class DefaultNoneDict(dict):
def __missing__(self, key):
return None
Run Code Online (Sandbox Code Playgroud)
这显然不会添加新密钥:
>>> d = DefaultNoneDict()
>>> d['a'] is None
True
>>> d
{}
Run Code Online (Sandbox Code Playgroud)
如果你想链接 .get()调用,你将不得不返回一个空字典,否则dict.get(keyA).get(keyB)会因属性错误而失败(None返回的第一个没有.get()方法).
一般来说,最好坚持默认类型并明确.没有错:
value = some_d.get(outer, {}).get(inner)
Run Code Online (Sandbox Code Playgroud)
使用带有自定义钩子defaultdict的dict子类或子类__missing__有一个缺点:当键丢失时,它们总是会产生默认值,即使你不小心在代码中的其他地方产生了错误的键.我经常选择显式dict.get()或dict.setdefault()代码路径,defaultdict因为我希望一个不存在的密钥在我的项目的其他部分产生错误.
| 归档时间: |
|
| 查看次数: |
40 次 |
| 最近记录: |