首页 > 解决方案 > 分析函数内部的'return'语句

问题描述

有时在一个函数中,我们需要return多次使用该语句。

当开发人员更改内部具有多个返回的函数时,很容易监督代码的某些部分,其中另一个返回被“隐藏”。如果单元测试没有涵盖所有可能的路径,那么灾难是肯定的——这只是时间问题。

def my_function():
    '''Multiple "return" inside'''

    if condition 1:
        return 1, 2, 3
    if condition 2:
        return 2, 3, 4

    return 5  # this is wrong: only 1 value returned, while 3-tuple expected

让我们在这里假设:最后一个返回是错误的,因为其他调用者期望 3 个项目的元组。

我想知道您是否知道如何自动捕获这些代码部分的简单方法?我以为我可以使用 AST,但我找不到任何有用的例子。

这个问题是关于自动代码分析并列出发现的此类案例 - 可能与运行单独的脚本有关。

当然,我可以编写一个尝试猜测解析器(例如使用正则表达式),然后“手动”检查所有不清楚的情况,但也许有更简单的方法......

标签: pythonreturncode-analysis

解决方案


根据您使用的 Python 版本以及您真正想要实现的目标,有几种方法可以重构代码。

正如已经建议的那样,一种方法是在 Python 3中使用类型提示。

另一种方法是重构代码,而不是使用多个return语句,而是调用其他更原子的方法来处理这些条件并返回适当的值。您在这些原子方法中使用异常处理来确保输出符合预期,或者如果最终返回类型意外,则引发异常。

def my_function():
    '''Multiple "return" inside'''

    if condition 1:
        output = func_handle_condition_one()
    if condition 2:
        output = func_handle_condition_two()

    output = some_other_value

    if type(output) is not tuple:
        raise TypeError("Invalid type for output")
    return output

此外,请确保您为您的条件使用了正确的构造(例如您是要使用多个if还是if-elif-else构造)。你甚至可以重构你的调用代码来调用正确的函数,而不是调用一个有这么多条件语句的函数。


推荐阅读