关于if语句:Python:try-except vs if-else来检查dict键

Python: try-except vs if-else to check dict keys

我遇到了一些代码,不知怎么的,我觉得这很奇怪。

1
2
3
4
5
var = None
try:
  var = mydict[a][b]
except:
  pass

我不太习惯用try-except来检查dict键,因为显然有一个if-else序列来处理相同的情况。

1
2
3
4
var = None
if a in mydict:
    if b in mydict[a]:
        var = mydict[a][b]

使用一种方法比使用另一种方法有"明显"的优势/劣势吗?


异常处理通常比if语句慢得多。有了嵌套字典,很容易理解作者为什么使用异常语句。但是,以下内容也会起作用。

1
2
3
4
5
6
var = mydict.get(a,{}).get(b,None)

if var is None:
   print("Not found")
else:
   print("Found:" + str(var))

dict对象上使用get会在键不存在时返回默认值。


一个缺点是这两个片段不相等,第一个缺点是一个笼统的说法,即不管发生什么,都要保持安静。

要使它们相等,请修改第一个代码段以仅捕获KeyError

1
2
3
4
5
var = None
try:
  var = mydict[a][b]
except KeyError:
  pass

正如他们所看到的,如果发生了除KeyError以外的事情,第二个片段将崩溃,第一个片段将继续,这可能会引发更多的问题。


请注意,在这种情况下,您可以选择:

1
var = mydict.get(a, {}).get(b)