gpt4 book ai didi

python - 在 "else" block 之后使用 "except" block 重要吗?

转载 作者:行者123 更新时间:2023-11-28 18:18:48 25 4
gpt4 key购买 nike

我知道what a try-else block is ,但请考虑以下两个函数:

# Without else
def number_of_foos1(x):
try:
number = x['foo_count']
except:
return 0
return number

# With else
def number_of_foos2(x):
try:
number = x['foo_count']
except:
return 0
else:
return number

x_with_foo = dict(foo_count=5)
x_without_foo = 3

不同于this try-else question我们没有向 try block 添加额外的行。在这两种情况下,try block 都是单行,并且不会违反将错误处理“接近”导致它的错误的原则。

区别在于在成功的 try block 之后我们去哪里。

在第一个 block 中,代码在 except block 之后继续,在第二个 block 中,代码在 else 处继续。

它们显然给出相同的输出:

In [138]: number_of_foos1(x_with_foo)
Out[139]: 5

In [140]: number_of_foos1(x_without_foo)
Out[140]: 0

In [141]: number_of_foos2(x_with_foo)
Out[141]: 5

In [142]: number_of_foos2(x_without_foo)
Out[142]: 0

哪个是首选?就口译员而言,它们甚至有什么不同吗?在成功的 try 之后继续时,您是否应该总是else 还是可以不缩进继续,如 number_of_foos1?

最佳答案

我想说您进入异常 block 的情况一定罕见(这就是我们所说的异常)。因此,使用 else 会使该 block 过于重要,这在正常操作中是不应该发生的。

所以如果发生异常,处理错误并返回,就不管它了。

在这里使用 else 会增加更多的复杂性,您可以通过反汇编这两个函数来确认这一点:

>>> dis.dis(number_of_foos1)
4 0 SETUP_EXCEPT 14 (to 17)

5 3 LOAD_FAST 0 (x)
6 LOAD_CONST 1 ('foo_count')
9 BINARY_SUBSCR
10 STORE_FAST 1 (number)
13 POP_BLOCK
14 JUMP_FORWARD 12 (to 29)

6 >> 17 POP_TOP
18 POP_TOP
19 POP_TOP

7 20 LOAD_CONST 2 (0)
23 RETURN_VALUE
24 POP_EXCEPT
25 JUMP_FORWARD 1 (to 29)
28 END_FINALLY

8 >> 29 LOAD_FAST 1 (number)
32 RETURN_VALUE

>>> dis.dis(number_of_foos2)
<exactly the same beginning then:>

15 20 LOAD_CONST 2 (0)
23 RETURN_VALUE

24 POP_EXCEPT
25 JUMP_FORWARD 5 (to 33)
28 END_FINALLY

17 >> 29 LOAD_FAST 1 (number)
32 RETURN_VALUE
>> 33 LOAD_CONST 0 (None)
36 RETURN_VALUE
>>>

如您在第二个示例中所见,无法访问地址 24、25、28、33 和 36,这是因为 Python 插入跳转到代码末尾,并且默认 return None 在主分支中。所有这些代码都是无用的,并且可以保证片段 #1 更简单并在主分支中返回结果。

关于python - 在 "else" block 之后使用 "except" block 重要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46669962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com