在 PEP 8 中我没有找到任何相关内容。我对于没有返回值的函数最符合 Python 风格的语法很感兴趣,你有什么想法吗?
是否有任何理由阻止没有 return 语句的函数(如示例3)?
示例1:
def foo():
print 'foo'
return None
示例2:
def foo():
print 'foo'
pass
示例3:
def foo():
print 'foo'
保持简单。示例3是最具Python风格的方式。
>>> import this
The Zen of Python, by Tim Peters
...
Simple is better than complex.
...
有两种使用情况:
return None
,因为否则可能会稍微让读者感到困惑:例子:
def find_user(name):
if database.is_ready():
return database.find_user_by_name(name)
else:
return None
技术上来说,你可以省略 else
部分,但这会让函数看起来很混乱。
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)
如果您的函数返回一个值,有时可能是None
,那么使用return None
即可。
如果您的函数不返回任何值,但想要提前返回,请使用无参数的return
。在最后一行,可以省略它。
pass
什么也不做,只有当需要语句来避免语法错误(例如在空类中)时才有用。
正如其他人所说,选项3是最好的选择。
更重要的是,选项3是一个好主意的原因是,许多人认为None
(在其他语言中称为null
)通常不应该返回,而应该抛出异常或使用Null对象模式。虽然我不完全同意这一点,但我认为避免明确地使用None
并且在语义上没有意义且含糊不清是有一些有效的观点。
我并不是说你永远不应该返回None
,但总的来说,我认为这不是一个好主意。
甚至在Python中,blah['DOESNOTEXIST']
将会抛出异常,在Java中map.get("DOESNOTEXIST")
将会返回null
,这也说明了这一点。
__init__
都返回None
。这就是它应该的方式。这是一个完全有效和正常的返回值。在Python中,dict.get('doesntexit')
也返回None
。 - SilentGhostNone
是否符合Pythonic风格呢?当然可以。 - Adam Gentdict.get('doesntexist')
是一个糟糕的例子。
你在映射中绑定了None
还是它不存在?Python中有很多东西是因为历史原因而工作的,我讨厌人们说这是为了保持简单。简单是一种观点。 - Adam Gent
pass
语句。根据文档:“当语法上需要一个语句但程序不需要执行任何操作时,可以使用它。” - Nicolasfoo()
所代表的内容可能会在需要返回值的地方使用。 - TC1