gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:26:29 25 4
gpt4 key购买 nike

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





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/

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