5

这些方法之间有什么区别、陷阱或缺点吗?

foo = dict(key=u"")
bar = foo.get('key', 'foobar')

对比

foo = dict(key=u"")
bar = bool(foo['key']) or 'foobar'
4

6 回答 6

10

您绝对不应该使用第二种形式,因为KeyError如果您的字典中不存在该键,它会抛出 a 。由于设置了密钥,因此您只能从第二种形式中获得可接受的行为。

于 2012-08-15T15:02:03.800 回答
6

第一段代码尝试从foo关联的中获取值key,如果foo没有键key,则默认为foobar。所以这里有两种情况:

  1. foo有钥匙key,所以bar设置为foo[key]
  2. foo没有钥匙key,所以bar设置为"foobar"

第二个查看与 中的键关联的值keyfoo如果该值是假的(即 if bool(foo[key])==False),则默认为foobar。如果foo没有密钥key,它会引发一个KeyError. 所以这里有三种情况:

  1. foo有密钥key,并且bool(foo[key])==True,所以bar设置为True
  2. foo有密钥key,并且bool(foo[key])==False,所以bar设置为"foobar"
  3. foo没有密钥key,因此代码引发了KeyError
于 2012-08-15T15:03:14.740 回答
4

KeyError如果foo['key']不存在,第二个示例将引发。

如果您想为bariffoo['key']不存在或包含 false 值分配默认值,这将是 Pythonic 的方法:

bar = foo.get('key') or 'foobar'
于 2012-08-15T15:01:34.640 回答
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"),它旨在完成这项工作。

于 2012-08-15T15:03:26.823 回答
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'
于 2012-08-15T15:05:49.753 回答
1

是的:

foo.get('key', 'foobar')总是返回一些东西(如果有一个名为'key'的键,它将返回它的值,如果没有这样的键,它将返回'foobar'。

但如果没有名为“key”的键,则bool(foo['key']) or 'foobar'可以引发 a 。KeyError

此外 -or这里的使用不是指示性的,因此该get方法是可取的。

于 2012-08-15T15:08:47.657 回答