这些方法之间有什么区别、陷阱或缺点吗?
foo = dict(key=u"")
bar = foo.get('key', 'foobar')
对比
foo = dict(key=u"")
bar = bool(foo['key']) or 'foobar'
这些方法之间有什么区别、陷阱或缺点吗?
foo = dict(key=u"")
bar = foo.get('key', 'foobar')
对比
foo = dict(key=u"")
bar = bool(foo['key']) or 'foobar'
您绝对不应该使用第二种形式,因为KeyError
如果您的字典中不存在该键,它会抛出 a 。由于设置了密钥,因此您只能从第二种形式中获得可接受的行为。
第一段代码尝试从foo
关联的中获取值key
,如果foo
没有键key
,则默认为foobar
。所以这里有两种情况:
foo
有钥匙key
,所以bar
设置为foo[key]
foo
没有钥匙key
,所以bar
设置为"foobar"
第二个查看与 中的键关联的值key
,foo
如果该值是假的(即 if 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
,因此代码引发了KeyError
KeyError
如果foo['key']
不存在,第二个示例将引发。
如果您想为bar
iffoo['key']
不存在或包含 false 值分配默认值,这将是 Pythonic 的方法:
bar = foo.get('key') or 'foobar'
这是使用的问题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")
,它旨在完成这项工作。
如果您认为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'
是的:
foo.get('key', 'foobar')
总是返回一些东西(如果有一个名为'key'的键,它将返回它的值,如果没有这样的键,它将返回'foobar'。
但如果没有名为“key”的键,则bool(foo['key']) or 'foobar'
可以引发 a 。KeyError
此外 -or
这里的使用不是指示性的,因此该get
方法是可取的。