没有返回值的函数,最符合Python风格的方式是什么?

13

在 PEP 8 中我没有找到任何相关内容。我对于没有返回值的函数最符合 Python 风格的语法很感兴趣,你有什么想法吗?

是否有任何理由阻止没有 return 语句的函数(如示例3)?

示例1:

def foo():
   print 'foo'
   return None

示例2:

def foo():
   print 'foo'
   pass

示例3:

def foo():
   print 'foo'

16
当然可以,以下是需要翻译的内容:Example 3 - rantanplan
3
你不应该在这里使用 pass 语句。根据文档:“当语法上需要一个语句但程序不需要执行任何操作时,可以使用它。” - Nicolas
4
你到底为什么要使用前两个? - TC1
2
@TC1 明确比隐式更好。 - glglgl
4
简单胜于复杂。如果函数不需要返回值,就直接这样写。第一个例子暗示了可能存在某些动态的操作,而foo()所代表的内容可能会在需要返回值的地方使用。 - TC1
显示剩余7条评论
5个回答

18

保持简单。示例3是最具Python风格的方式。

>>> import this

The Zen of Python, by Tim Peters

...
Simple is better than complex.
...

但是显式优于隐式。 - glglgl
7
我们不能通过使用更适用于系统设计而不是代码语法的格言来取得任何成果。 Thg435的回答更好,因为它包含了如何最好地表达你想要代码表达的意思的思考。 - madjar

15

有两种使用情况:

  • 一个从不返回任何内容的函数(又称“过程”)。应该完全省略 return。
  • 一个对某些输入返回 None 的函数。我个人更喜欢在那里放置 return None,因为否则可能会稍微让读者感到困惑:

例子:

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

技术上来说,你可以省略 else 部分,但这会让函数看起来很混乱。


10
现在这种做法很丑陋,我是从读者的角度说的。只需返回None而不加else语句! - Denis
8
从执行角度来看,这是不必要的,但它可以告诉读者,如果数据库没有准备好,该函数将按设计返回 None 值,而这并不仅仅是作者忽视了某些内容。 - madjar
3
读者应该学习如何阅读Python。缩进清楚地表明了执行流程。 - rantanplan

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)

为什么不这样定义foo(x)函数: 如果x >= 0: 返回math.sqrt(x) 。这样做非常方便,不需要在默认情况下放置return,也不需要else/ - Vova
这些是示例。 - Vasili Syrakis

7

如果您的函数返回一个值,有时可能是None,那么使用return None即可。

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

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


-1

正如其他人所说,选项3是最好的选择。

更重要的是,选项3是一个好主意的原因是,许多人认为None(在其他语言中称为null)通常不应该返回,而应该抛出异常或使用Null对象模式。虽然我不完全同意这一点,但我认为避免明确地使用None并且在语义上没有意义且含糊不清是有一些有效的观点。

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

甚至在Python中,blah['DOESNOTEXIST']将会抛出异常,在Java中map.get("DOESNOTEXIST")将会返回null,这也说明了这一点。


1
很多人认为是谁?每个__init__都返回None。这就是它应该的方式。这是一个完全有效和正常的返回值。在Python中,dict.get('doesntexit')也返回None - SilentGhost
许多人成为FP程序员。许多语言没有null的概念。许多人认为Tony Hoare是null的发明者:“我称它为我的亿万美元错误。这是在1965年发明了null引用。...但我无法抗拒放置一个null引用的诱惑,仅仅因为它很容易实现。这导致了无数的错误、漏洞和系统崩溃,可能在过去四十年中造成了数十亿美元的痛苦和损失。”但是在Python中有时返回None是否符合Pythonic风格呢?当然可以。 - Adam Gent
严肃地说...我因为说避免在不合适的情况下使用null而被downvote了!dict.get('doesntexist')是一个糟糕的例子。 你在映射中绑定了None还是它不存在?Python中有很多东西是因为历史原因而工作的,我讨厌人们说这是为了保持简单。简单是一种观点。 - Adam Gent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接