返回变量vs返回函数调用

时间:2017-01-13 09:57:48

标签: python pep8

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

方法1

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

方法2

def method():
    return meth2()

4 个答案:

答案 0 :(得分:5)

PEP8没有指定是否应该返回变量而不是函数。

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

  

在回复陈述中保持一致。函数中的所有return语句都应该返回一个表达式,或者它们都不应该返回。如果任何return语句返回一个表达式,那么任何没有返回值的return语句都应该明确地将其声明为return None,并且在函数末尾应该有一个显式的return语句(如果可以访问)。

# 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

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

,则可能会出现问题

导致异常的代码示例:

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

答案 1 :(得分:4)

通常情况下,我很喜欢方法1,特别是在数学代码中。

方法1更容易调试并因此维护,因为您可以在return a上放置断点,并轻松查看a是什么。 (虽然很好,C ++ Boost程序员喜欢采用方法2,调用堆栈很大,调试非常困难 - 你必须求助于检查CPU寄存器!)

优秀的python解释器将命名返回值优化,因此您不必担心会采用不必要的值复制。

答案 2 :(得分:1)

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

方法1可用于调试目的,或者在返回值

之前需要完成其他操作

答案 3 :(得分:0)

我更喜欢方法1 bcos,它使调试变得容易(你可以没有它吗?)

如果我正在调试mehtod 2的代码,那么我使用pycharm Evaluate Expression选项来了解返回的返回语句。