这个问题在这里已经有了答案:
Weird Try-Except-Else-Finally behavior with Return statements
(3 个回答)
1年前关闭。
如果我尝试下面的代码,我看到没有返回正常的块返回值,但 finally 块的返回值是:
>>> def f():
... try:
... return "normal"
... finally:
... return "finally"
...
>>> f()
'finally'
一个更高级的例子是在每个 return 语句中调用一个函数:
在那种情况下,我可以看到:
show
函数被评估(但不返回),show
函数被评估并返回:>>> def show(x):
... print(x)
... return x
...
>>> def g():
... try:
... return show("normal")
... finally:
... return show("finally")
...
>>> g()
normal
finally
'finally'
在 finally 子句中有 return 语句是一个好习惯吗?
或者,这是一个潜在的错误(应该由代码分析工具或代码审查检测到)?
编辑
另一个例子有一个异常(exception):
>>> def f():
... try:
... raise ValueError("bad")
... finally:
... return "good"
...
>>> f()
'good'
奇怪的!
请您参考如下方法:
恕我直言,有一个 return
在 finally
如果有 return
,条款是不好的做法相关声明 try
或 except
块。
try:
# lots of spaghetti code
return fancy_expression_with_side_effects
except AllKindsOfError:
# lots of alternative spaghetti code
finally:
# many a mouse wheel spin down the module
# lots of clean up
return eternal_return_value
虽然这将构成有效的 Python,但它确实不应该。第一个
return
声明会
部分 执行:您将观察到评估
fancy_expression_with_side_effects
的副作用(尝试
return print('foo')
那里)它仍然会
不是 返回该表达式的值。我曾经在那种确切的情况下挠了几个小时。
但是,如果
finally
中的 return 语句是唯一的 return 语句,人们将能够以一种简单的预期方式轻松地遵循逐步执行流程,我看不出有太多错误,但仍然会非常小心:
在很多软件项目中,你可能是知道这些东西的资深 Python 人,但是你有什么保证没有其他人会添加
return
稍后在其他地方声明?