12

AI 在 PEP 8 中找不到任何相关内容。我对您对没有返回的最 Pythonic 函数语法的想法感兴趣?

是否有任何理由阻止没有返回线的函数(示例 3)?

示例 1:

def foo():
   print 'foo'
   return None

示例 2:

def foo():
   print 'foo'
   pass

示例 3:

def foo():
   print 'foo'
4

5 回答 5

18

把事情简单化。示例 3 是最 Pythonic 的方式。

>>> import this

The Zen of Python, by Tim Peters

...
Simple is better than complex.
...
于 2012-11-09T11:24:59.657 回答
15

有两个用例:

  • 一个从不返回任何东西的函数(又名“过程”)。你应该完全省略 return 。
  • 为某些输入返回 None 的函数。我个人更喜欢放在return None那里,否则可能会使读者感到困惑:

例子:

 def find_user(name):
     if database.is_ready():
        return database.find_user_by_name(name)
     else:
        return None

从技术上讲,您可以删除该else部分,但这会使函数看起来令人困惑。

于 2012-11-09T11:26:10.590 回答
11

PEP8对此主题提出了建议

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

是的:

def foo(x):
    if x >= 0:
        return math.sqrt(x)
    else:
        return None

def bar(x):
    if x < 0:
        return None
    return math.sqrt(x)

不:

def foo(x):
    if x >= 0:
        return math.sqrt(x)

def bar(x):
    if x < 0:
        return
    return math.sqrt(x)
于 2017-01-13T12:40:50.013 回答
7

如果你的函数返回一个值,那可能None是某种情况,return None很好。

如果您的函数没有返回值,但您想提前返回,请使用return不带任何参数的函数。在最后一行,您可以省略它。

pass什么都不做,只有在需要语句来避免语法错误时才有用(例如,在空类中)

于 2012-11-09T11:26:03.773 回答
-1

正如其他人所说,选项 3 是迄今为止最好的。

选项 3 是一个好主意的更多原因是,许多人认为Nonenull在其他语言中也称为)通常不应该被返回,并且您应该抛出异常或使用 Null Object 模式。虽然我不完全同意这一点,但我认为None当它在语义上没有意义并且模棱两可时,避免特别明确地使用是有道理的。

我并不是说你永远不应该回来None,但总的来说,我认为这不是一个好主意。

您甚至可以在今天的 Python 中看到这一点,其中blah['DOESNOTEXIST']将抛出异常,而在 Javamap.get("DOESNOTEXIST")中将返回null

于 2012-11-14T14:58:53.983 回答