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





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


    评论关闭
    IT干货网

    微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!