Python的getattr相当于字典?

在Python中,如果它存在,给我dict['foo'] ,如果不存在,给我这个其他值bar是什么最简洁的方式? 如果我使用的是对象而不是字典,那么我使用getattr

 getattr(obj, 'foo', bar) 

但是如果我尝试使用字典,这会引发一个关键的错误(我发现这个区别是来自JavaScript / CoffeeScript的不幸)。 同样,在JavaScript / CoffeeScript中,我只是写

 dict['foo'] || bar 

但是,这又会产生一个KeyError。 该怎么办? 请简洁一点

2 Solutions collect form web for “Python的getattr相当于字典?”

dict.get(key, default)返回dict[key]如果键入dict,否则返回默认值。

请注意,默认的defaultNone所以如果你说dict.get(key)和key不在dict中,那么这将只返回None而不是像使用[]键访问符号时引发KeyError一样。

另外看看集合模块的defaultdict类。 这是一个字典,您可以指定它找不到密钥时必须返回的内容。 有了它你可以做这样的事情:

 class MyDefaultObj: def __init__(self): self.a = 1 from collections import defaultdict d = defaultdict(MyDefaultObj) i = d['NonExistentKey'] type(i) <instance of class MyDefalutObj> 

这允许你使用熟悉的d [i]约定。

但是,正如mikej所说,.get()也可以,但是这里更接近JavaScript的例子:

 d = {} i = d.get('NonExistentKey') or MyDefaultObj() # the reason this is slightly better than d.get('NonExistent', MyDefaultObj()) # is that instantiation of default value happens only when 'NonExistent' does not exist. # With d.get('NonExistent', MyDefaultObj()) you spin up a default every time you .get() type(i) <instance of class MyDefalutObj> 
  • pandas:我怎样才能使用apply()函数为单个列?
  • 典型的AngularJS工作stream程和项目结构(使用Python Flask)
  • Django的JSONField里面ArrayField
  • Python:使用4个空格进行缩进。 为什么?
  • python NameError:未定义全局名称__file__
  • 这个socket.gaierror是什么意思?
  • Python(和Python C API):__new__与__init__
  • Python / Matplotlib - 有没有办法使一个不连续的轴?
  • 基于边缘像素图的图像分割
  • 在Python中处理string中的转义序列
  • 如何将一列分成两列?