【发布时间】:2020-02-12 01:44:45
【问题描述】:
如果我尝试下面的代码,我看到没有返回正常的块返回值,但是finally块返回值是:
>>> def f():
... try:
... return "normal"
... finally:
... return "finally"
...
>>> f()
'finally'
一个更高级的例子是在每个 return 语句中调用一个函数:
在那种情况下,我可以看到:
- 在普通块中,
show函数被评估(但不返回), - 在 finally 块中,评估并返回
show函数:
>>> def show(x):
... print(x)
... return x
...
>>> def g():
... try:
... return show("normal")
... finally:
... return show("finally")
...
>>> g()
normal
finally
'finally'
在 finally 子句中有一个 return 语句是一个好习惯吗? 或者,它是一个潜在的错误(应该通过代码分析工具或代码审查来检测)?
编辑
另一个例外的例子:
>>> def f():
... try:
... raise ValueError("bad")
... finally:
... return "good"
...
>>> f()
'good'
奇怪!
【问题讨论】:
-
我认为文档解释了其中的一部分:docs.python.org/3/tutorial/… 它说“如果 finally 子句包含 return 语句,finally 子句的 return 语句将在 return 之前执行,而不是 return try 子句中的语句。”
-
cpython 有一个时髦的单元测试github.com/python/cpython/blob/…
标签: python python-3.x try-finally