2012-08-15 380 views
2

这些方法之间有什么区别,缺陷或缺点吗?Python字典,关键存在与回退

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

VS

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

第二个引发错误?它实际上不会倒退 – jamylak 2012-08-15 14:59:42

+0

第一个是正确的,第二个不是? – 2012-08-15 15:00:40

+0

没有它肯定不 – 2012-08-15 15:00:42

回答

6

你应该最肯定不会使用第二种形式,因为如果密钥不存在您的字典,它会抛出KeyError。你只能从第二种形式中获得可接受的行为,因为密钥已设置。

+0

*和* OP得到一个布尔值而不是'foo ['key']'的值.. – 2012-08-15 15:06:21

3

第二个例子将提高KeyError如果foo['key']不存在。

如果你想为默认值,如果foo['key']不存在或包含falsey值赋给bar,这将是Python的方式做到这一点:

bar = foo.get('key') or 'foobar' 
+0

我不会使用'或'。例如,考虑'foo = dict(key = None)'的情况。 – 2012-08-15 15:02:48

+0

我明白你的观点,只有当不存在的'foo ['key']'和'None' /其他falsey值对用户意味着同样的事情时,我的示例才有效。 – Imran 2012-08-15 15:04:32

4

代码的第一片尝试从fookey相关联的值,并且如果foo不具有键key,默认为foobar。因此,这里有两种情况:

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

第二查看与foo中的密钥key相关联的值,如果该值是虚假的(即,如果是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
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问题,但布尔计算结果为false。你应该使用get("key", "default"),它的目的是为了完成这项工作。

+0

OP的示例已经公开了这种行为,一个空字符串是虚假的。 – 2012-08-15 15:04:26

+0

事实上,我的回答表明他们是不同的。除非我误解了它? – Joe 2012-08-15 15:07:00

+0

不,我只是想指出问题已经出现在OP的例子中,就这些。 – 2012-08-15 15:10:45

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' 
0

是:

foo.get('key', 'foobar')始终返回的东西(如果有一个键名“键”,它会返回它的值,如果没有这样的键,也可以返回“foobar的”。

bool(foo['key']) or 'foobar'可以提高一个KeyError如果有一个名为“钥匙”没有这样的关键。

此外 - 这里使用or并不是指示性的,所以get方法更可取。