python - 在 finally 子句中返回值是错误的吗

标签 python python-3.x try-finally

这个问题在这里已经有了答案:





Weird Try-Except-Else-Finally behavior with Return statements

(3 个回答)


1年前关闭。




如果我尝试下面的代码,我看到没有返回正常的块返回值,但 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 语句是一个好习惯吗?
    或者,这是一个潜在的错误(应该由代码分析工具或代码审查检测到)?

    编辑

    另一个例子有一个异常(exception):

    >>> def f():
    ...     try:
    ...         raise ValueError("bad")
    ...     finally:
    ...         return "good"
    ... 
    >>> f()
    'good'
    

    奇怪的!

    最佳答案

    恕我直言,有一个 returnfinally如果有 return,条款是不好的做法相关声明 tryexcept块。

    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稍后在其他地方声明?

    关于python - 在 finally 子句中返回值是错误的吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58393623/

    相关文章:

    c# - 使用 block : object initialization compiled into try block

    java - 此行有多个标记 - 标记 ")"上的语法错误,;预期 - token "("上的语法错误,{预期

    python - 在 Python 中使用套接字发送加密字符串

    python - Python 3.10 中的 Tkinter?

    python-3.x - python : How can I press arrow keys randomly selenium

    java - Final block 何时相对于 Return 运行

    python - PyTorch 教程 freeze_support() 问题

    python - PyTorch:使用tensor.cuda()和tensor.to(torch.device (“cuda:0”)之间有什么区别

    python - __sizeof__ str 大于 __sizeof__ 包含该字符串的元组

    python - 无法更新 pip 或在 pip 中安装任何内容。使用 Anaconda