gpt4 book ai didi

python - 在 try/except block 中创建变量是否被认为是一种不好的做法?

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

让我们考虑这个例子 - 代码返回列表 li 中第一个 None 值的索引(如果存在)或最后一个元素的索引,如果 None 不在 li 中。

我可能会检查 None 是否在列表中,但使用 ifs 不是首选方式 - Dive Into Python 鼓励使用异常,因为据说它们更快并使代码更清晰(参见 this 问题)。所以我提出了三种方法:

1.

try:
my_index = li.index(None)
except ValueError:
my_index = len(li) - 1

print my_index

my_index 在 try/except block 中声明。更少的行,没有多余的声明。可能的问题 - 不同的异常类型将导致不创建 my_index 并在 print 上使脚本崩溃。

2.

my_index = None  # or anything else
try:
my_index = li.index(None)
except ValueError:
my_index = len(li) - 1

print my_index

my_index 在 try/except 之前声明,并且无论发生什么异常都会分配一个值。缺点 - 更多行,看起来多余。

3. 编辑:不起作用 - 无论 try/except 结果如何,finally 都会执行

try:
my_index = li.index(None)
except ValueError:
my_index = len(li) - 1
finally:
my_index = None # or anything else

print my_index

优点 - 总是有效(或者至少我是这么认为的)。缺点 - 我从未见过有人在我的整个 Python 体验中使用 finally,这一定是有原因的。

以下哪种方法被认为是首选和 Pythonic 方式?也许有更好的解决方案?

最佳答案

try:
my_index = li.index(None)
except ValueError:
my_index = len(li) - 1

print my_index

Possible problem - different exception type will result in not creating my_index and crashing the script on print.

错了,没有。如果引发任何其他异常,则整个代码块将被中止,因为异常会冒泡到调用者。因此,如果除了 ValueError 之外的任何其他异常类型被引发,print 将永远不会被执行。这是一个非常明智的行为:您处理您期望的错误并且可以处理,并让其他错误导致整个 block 中止,可能是整个脚本。这是您想要的最明智、最简洁的解决方案。

关于python - 在 try/except block 中创建变量是否被认为是一种不好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45732704/

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