Return 变量 vs return 函数调用

Return a variable vs return a function call

推荐的从方法返回值的 Pythonic 方式是什么?为什么? PEP8 风格指南中是否有任何关于此的文档,我找不到。

方法一

def method():
    a = meth2()
    return a

方法二

def method():
    return meth2()

通常我会选择方法 1,尤其是在数学代码中。

方法 1 更易于调试和维护,因为您可以在 return a 上放置断点,并且很容易看到 a 是什么。 (尽管很棒,C++ Boost 程序员喜欢采用具有非常大的调用堆栈的方法 2,这会使调试变得非常困难 - 你必须求助于检查 CPU 寄存器!)

优秀的 python 解释器会命名为 return 值优化,因此您不必担心会出现不必要的值副本。

方法 2 似乎不错,因为如果您只是返回从函数接收到的值,则不需要任何变量。另外,这样看起来不错 :P

方法 1 可用于调试目的,或者在返回值之前需要执行其他操作

PEP8 没有指定您是否应该 return 变量还是函数。

然而,它确实说你应该保持一致:

Be consistent in return statements. Either all return statements in a function should return an expression, or none of them should. If any return statement returns an expression, any return statements where no value is returned should explicitly state this as return None , and an explicit return statement should be present at the end of the function (if reachable).

# Yes
def myfunction(a: int, b: int) -> int:
    if a % 2 == 0:
        return int(a ** b)
    else:
        return 0

# No
def my_bad_function(a: int, b: int) -> int:
    if a % 2 == 0:
        return int(a ** b)
    # Implicitly returns None when the above if statement evaluates False

return 相同类型的变量也是一个好主意(虽然未包含在 PEP8 中)。
您会看到我在上述函数中添加了可选的类型提示。第二个函数偶尔会 return None.
如果另一个使用此函数的代码块期望 return 值具有与 int 相同的属性,例如 int.bit_length()

,这可能会导致问题

会导致异常的代码示例:

for n in range(1, 10):
    nlen = my_bad_function(n * 5, n).bit_length()

我更喜欢方法 1,因为它使调试变得容易(没有它你能活下去吗?)

如果我正在调试方法 2 的代码,那么我使用 pycharm 评估表达式选项来了解 return 语句是什么 returning。