Python检查函数是否有return语句

Mis*_*sha 2 python return

例如

def f1():
    return 1

def f2():
    return None

def f3():
    print("Hello")
Run Code Online (Sandbox Code Playgroud)

功能f1()f2()返回一些但f3()不是.

a = f2()
b = f3()
Run Code Online (Sandbox Code Playgroud)

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

Kev*_*vin 7

我喜欢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))
Run Code Online (Sandbox Code Playgroud)

结果:

<function f1 at 0x01D151E0> True
<function f2 at 0x01D15AE0> True
<function f3 at 0x0386E108> False
Run Code Online (Sandbox Code Playgroud)

当然,这仅适用于具有用Python编写的源代码的函数,并非所有函数都可以.例如,contains_explicit_return(math.sqrt)会给你一个TypeError.

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

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

def g():
    if False:
        return 1
Run Code Online (Sandbox Code Playgroud)

contains_explicit_return会给True双方的这些,尽管f没有遇到在其执行的一半回报,而g不是遇到一回.


st0*_*0le 6

根据定义,函数总是返回一些东西.即使你没有指定它,return Nonepython函数的末尾也有一个隐含的东西.

您可以使用检查模块检查"返回".

编辑:我刚刚意识到.这是非常错误的,因为如果函数中的字符串文字中包含"返回",它将返回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))
Run Code Online (Sandbox Code Playgroud)