python - 分析函数内部的'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,但我找不到任何有用的例子。
这个问题是关于自动代码分析并列出发现的此类案例 - 可能与运行单独的脚本有关。
当然,我可以编写一个尝试猜测解析器(例如使用正则表达式),然后“手动”检查所有不清楚的情况,但也许有更简单的方法......
解决方案
根据您使用的 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
构造)。你甚至可以重构你的调用代码来调用正确的函数,而不是调用一个有这么多条件语句的函数。
推荐阅读
- c++ - 输出在每个测试用例之后打印,而不是在最后打印
- ads - Google Ads gtag.js 跟踪代码会从我的随机开发 test.html 中收集数据吗?
- apache-spark - spark独立集群:如何限制工人数量?
- caching - 标记大小和缓存位练习
- computational-geometry - 如何使用 CGAL 计算功率外壳网格?
- algorithm - 国际象棋对角线方程背后的逻辑是什么?
- browser-automation - 是否有在无头模式下支持 Widevine drm 的驱动程序/浏览器?
- gnuplot - gnuplot - 非线性曲线拟合、参数初始化和边界定义
- css - 是否可以在反应应用程序的 .js 文件中使用 css?
- c# - 图片框重复值