E.g。
def f1():
return 1
def f2():
return None
def f3():
print("Hello")
函数f1()
和f2()
会返回f3()
之外的内容。
a = f2()
b = f3()
此处a
等于b
所以我不能只比较函数的结果来检查是否有return
。
答案 0 :(得分: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))
结果:
<function f1 at 0x01D151E0> True
<function f2 at 0x01D15AE0> True
<function f3 at 0x0386E108> False
当然,这仅适用于具有用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
会在True
上提供f
,尽管g
没有遇到一半的执行返回,{{1}}没有遇到返回
答案 1 :(得分:6)
按定义,函数总是返回一些东西。即使你没有指定它,在python函数的末尾也有一个隐式的return None
。
您可以查看&#34;返回&#34;与检查模块。
编辑:我刚刚意识到。这是非常错误的,因为如果函数中的字符串文字有&#34;返回&#34;它会返回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))