如何以编程方式确保函数包含return语句?

2024-10-01 17:32:12 发布

您现在位置:Python中文网/ 问答频道 /正文

如何验证函数是否包含return关键字?我经常忘记返回行,所以我担心我的包的用户在提供基于函数的输入时也会忘记

def appler():
    a = "apple"
    # `return` is missing

def bananer():
    b = "banana"
    return b

我可以为包含"return"的最后一行解析函数的实际代码字符串,但这不是很健壮(可能由注释触发)

def validate_funk(funk):
    if condition_to_check_that_it_contains_rtrn:
        pass
    else:
        raise ValueError(f"Yikes - The function you provided not contain a `return` statement:\n\n{funk}")
>>> validate_funk(appler)
#triggers ValueError

>>> validate_funk(bananer)
# passes

编辑:理想情况下无需运行函数


Tags: 函数代码用户applereturnisdef关键字
3条回答

您真正关心的可能不是return语句本身,而是函数返回某种类型的东西。使用type hints (PEP 484)最容易实现这一点:

def appler() -> str:
    a = "apple"
    # `return` is missing

def bananer() -> str:
    b = "banana"
    return b

现在,运行mypy或Pyre(或许多其他)之类的static analysis tool将发出关于函数appler(预期为str,获得NoneType)中错误返回类型的警告

寻找萨比克的答案,寻找更一般的答案。编写(单元)测试是另一个很好的实践,它可以解决更多的问题,如果做得好的话,还可以投资于代码的可维护性

默认情况下,没有return语句的函数返回None

>>> def abc():
    pass
>>> print(abc())
None
>>> 

您可以使用以下方法添加支票:

def validate_func(function):
    if function() == None:
        raise ValueError("Yikes - Does not contain a `return` statement")

但也有一些缺点

  1. 你必须执行这个函数
  2. 如果在函数中return正在None运行,则它将不起作用

不太实际,但是的,这是一种方法。您还可以获取a list of local functionsa list of methods in a class并循环遍历它们,而无需单独检查每个函数

对于所问的问题,ast模块将允许您检查这一点

然而,它本身似乎不是很有用——正如其他人所指出的,没有return的函数是有效的(它返回None),并且仅仅因为函数有return并不意味着它返回正确的值,甚至任何值(该return可以在if语句中)

有两种标准的处理方法:

  • 单元测试-使用各种输入组合(可能只有一个,可能有数百个)调用函数的单独代码,并检查答案是否与手动计算的答案匹配,或者是否满足要求

  • 在Python pylint的情况下,检查return语句的思想的更一般的实现是“lint”;这将检查您的代码并检查各种看起来可能是错误的模式。一个附带的好处是它已经存在,并且可以检查几十种常见模式

  • 另一个不同的更通用的实现是mypy类型检查器;这不仅检查是否有return语句,而且还检查它是否返回正确的类型,如在函数头中注释的那样

通常,这些将与“门控主干”开发过程一起使用;禁止对main版本进行手动更改,只有通过测试、lint和/或mypy的更改才能被接受为main版本

相关问题 更多 >

    热门问题