这些方法之间是否有任何区别,缺点或缺点?
foo = dict(key=u"")
bar = foo.get('key', 'foobar')
VS
foo = dict(key=u"")
bar = bool(foo['key']) or 'foobar'
答案 0 :(得分:6)
您绝对不应该使用第二种形式,因为如果您的字典中不存在该键,它将抛出KeyError
。您只能从第二种形式获得可接受的行为,因为密钥已设置。
答案 1 :(得分:4)
第一段代码尝试从与foo
相关联的key
获取值,如果foo
没有密钥key
,则默认为{{1 }}。所以这里有两种情况:
foobar
的密钥为foo
,因此key
设置为bar
foo[key]
没有密钥foo
,因此key
设置为bar
第二个查看与"foobar"
中的密钥key
相关联的值,如果该值为假(即,如果foo
),则默认为bool(foo[key])==False
}。如果foobar
没有密钥foo
,则会引发key
。所以这里有三个案例:
KeyError
包含密钥foo
和key
,因此bool(foo[key])==True
设置为bar
True
包含密钥foo
和key
,因此bool(foo[key])==False
设置为bar
"foobar"
没有密钥foo
,因此代码会引发key
答案 2 :(得分:3)
如果KeyError
不存在,第二个示例将引发foo['key']
。
如果您想要bar
如果foo['key']
不存在或包含falsey值,则默认值为bar = foo.get('key') or 'foobar'
,这将是Pythonic的方法:
{{1}}
答案 3 :(得分:1)
这是使用bool()
one = {"my_key": None}
print "Get:", one.get("my_key")
print "Bool:", bool(one.get("my_key"))
print "Get with falback:", one.get("my_key", "other")
Get: None
Bool: False
Get with falback: None
请注意,其中有一个值None
,但bool的计算结果为false。你应该使用get("key", "default")
,它是为了完成这项工作而设计的。
答案 4 :(得分:1)
如果您认为foo = dict(key=u"")
会生成一个字典,其默认值为空字符串,那么您就错了。您需要defaultdict
:
In [6]: bool(foo['key']) or 'foobar'
Out[6]: 'foobar'
In [7]: foo = dict(key='')
In [9]: bool(foo['nokey']) or 'foobar'
KeyError: 'nokey'
使用defaultdict
,dict.get
,甚至是dict.setdefault
。
好的方式也有效:
In [10]: try:
....: v = foo['nokey']
....: except KeyError:
....: v = 'foobar'
....:
In [11]: v
Out[11]: 'foobar'
答案 5 :(得分:0)
是:
foo.get('key', 'foobar')
总是返回一些内容(如果有一个键名'key',它将返回其值,如果没有这样的键,它将返回'foobar'。
但如果没有名为“key”的密钥,则bool(foo['key']) or 'foobar'
可以引发KeyError
。
此外 - 此处or
的使用并非指示性,因此get
方法更为可取。