【问题标题】:Python getattr equivalent for dictionaries?字典的Python getattr等价物?
【发布时间】:2010-06-21 23:28:45
【问题描述】:

在 Python 中,最简洁的说法是:“如果存在,请给我dict['foo'],如果不存在,请给我另一个值bar”?如果我使用的是对象而不是字典,我会使用getattr

getattr(obj, 'foo', bar)

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

dict['foo'] || bar

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

【问题讨论】:

    标签: python


    【解决方案1】:

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

    注意default 的默认值是None,所以如果你说dict.get(key) 并且key 不在字典中,那么这只会返回None,而不是像使用@ 时那样引发KeyError 987654329@ 密钥访问符号。

    【讨论】:

    • 谢谢,这正是我想要的!我想你刚刚创造了一个新的速度记录。
    • 嘿,是否可以仅针对键的特定特征执行此操作...Here,仅当“键”或更确切地说“名称”以字母开头时才返回值f'。
    【解决方案2】:

    还可以查看集合模块的 defaultdict 类。这是一个 dict,您可以指定在找不到密钥时它必须返回的内容。有了它,您可以执行以下操作:

    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>
    

    【讨论】:

      猜你喜欢
      • 2015-02-24
      • 2010-10-21
      • 2017-10-14
      • 2012-05-11
      • 1970-01-01
      • 2021-07-17
      • 1970-01-01
      • 2020-05-12
      • 2016-07-04
      相关资源
      最近更新 更多