Python检查函数是否有返回状态

2024-04-27 23:59:24 发布

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

例如

def f1():
    return 1

def f2():
    return None

def f3():
    print("Hello")

函数f1()f2()返回某些内容,但f3()不返回。在

^{pr2}$

这里a等于b,所以我不能仅仅比较函数的结果来检查是否有return。在


Tags: 函数none内容helloreturndeff2f1
2条回答

根据定义,函数总是返回某些值。即使不指定它,在python函数的末尾也有一个隐式的return None。在

您可以使用inspect模块检查“返回”。在

编辑:我刚刚意识到。这是非常错误的,因为如果函数中有一个字符串文本包含“return”,那么它将返回True。我想一个健壮的正则表达式会有帮助。在

from inspect import getsourcelines


def f(n):
    return 2 * n


def g(n):
    print(n)


def does_function_have_return(func):
    lines, _  = getsourcelines(func)
    return any("return" in line for line in lines) # might give false positives, use regex for better checks


print(does_function_have_return(f))
print(does_function_have_return(g))

我喜欢st0le检查源代码的想法,但是您可以更进一步,将源代码解析为源代码树,这样可以消除误报的可能性。在

import ast
import inspect

def contains_explicit_return(f):
    return any(isinstance(node, ast.Return) for node in ast.walk(ast.parse(inspect.getsource(f))))

def f1():
    return 1

def f2():
    return None

def f3():
    print("return")

for f in (f1, f2, f3):
    print(f, contains_explicit_return(f))

结果:

^{pr2}$

当然,这只适用于那些源代码是用Python编写的函数,而不是所有函数都是这样。例如,contains_explicit_return(math.sqrt)将给您一个TypeError。在

此外,这不会告诉您函数的任何特定执行是否命中return语句。考虑以下功能:

def f():
    if random.choice((True, False)):
        return 1

def g():
    if False:
        return 1

contains_explicit_return将给出{},尽管{}在执行的一半时间内没有遇到返回,并且{}也没有遇到返回。在

相关问题 更多 >