这些方法之间有什么区别、陷阱或缺点吗?
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设置为Truefoo有密钥key,并且bool(foo[key])==False,所以bar设置为"foobar"foo没有密钥key,因此代码引发了KeyErrorKeyError如果foo['key']不存在,第二个示例将引发。
如果您想为bariffoo['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方法是可取的。