这些方法之间有什么区别,缺陷或缺点吗?Python字典,关键存在与回退
foo = dict(key=u"")
bar = foo.get('key', 'foobar')
VS
foo = dict(key=u"")
bar = bool(foo['key']) or 'foobar'
这些方法之间有什么区别,缺陷或缺点吗?Python字典,关键存在与回退
foo = dict(key=u"")
bar = foo.get('key', 'foobar')
VS
foo = dict(key=u"")
bar = bool(foo['key']) or 'foobar'
你应该最肯定不会使用第二种形式,因为如果密钥不存在您的字典,它会抛出KeyError
。你只能从第二种形式中获得可接受的行为,因为密钥已设置。
*和* OP得到一个布尔值而不是'foo ['key']'的值.. – 2012-08-15 15:06:21
第二个例子将提高KeyError
如果foo['key']
不存在。
如果你想为默认值,如果foo['key']
不存在或包含falsey值赋给bar
,这将是Python的方式做到这一点:
bar = foo.get('key') or 'foobar'
我不会使用'或'。例如,考虑'foo = dict(key = None)'的情况。 – 2012-08-15 15:02:48
我明白你的观点,只有当不存在的'foo ['key']'和'None' /其他falsey值对用户意味着同样的事情时,我的示例才有效。 – Imran 2012-08-15 15:04:32
代码的第一片尝试从foo
与key
相关联的值,并且如果foo
不具有键key
,默认为foobar
。因此,这里有两种情况:
foo
有钥匙key
,所以bar
设置为foo[key]
foo
没有关键key
,所以bar
设置为"foobar"
第二查看与foo
中的密钥key
相关联的值,如果该值是虚假的(即,如果是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
这是使用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
问题,但布尔计算结果为false。你应该使用get("key", "default")
,它的目的是为了完成这项工作。
OP的示例已经公开了这种行为,一个空字符串是虚假的。 – 2012-08-15 15:04:26
事实上,我的回答表明他们是不同的。除非我误解了它? – Joe 2012-08-15 15:07:00
不,我只是想指出问题已经出现在OP的例子中,就这些。 – 2012-08-15 15:10:45
如果你认为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')
始终返回的东西(如果有一个键名“键”,它会返回它的值,如果没有这样的键,也可以返回“foobar的”。
但bool(foo['key']) or 'foobar'
可以提高一个KeyError
如果有一个名为“钥匙”没有这样的关键。
此外 - 这里使用or
并不是指示性的,所以get
方法更可取。
第二个引发错误?它实际上不会倒退 – jamylak 2012-08-15 14:59:42
第一个是正确的,第二个不是? – 2012-08-15 15:00:40
没有它肯定不 – 2012-08-15 15:00:42