AI 在 PEP 8 中找不到任何相关内容。我对您对没有返回的最 Pythonic 函数语法的想法感兴趣?
是否有任何理由阻止没有返回线的函数(示例 3)?
示例 1:
def foo():
print 'foo'
return None
示例 2:
def foo():
print 'foo'
pass
示例 3:
def foo():
print 'foo'
把事情简单化。示例 3 是最 Pythonic 的方式。
>>> 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 Object 模式。虽然我不完全同意这一点,但我认为None
当它在语义上没有意义并且模棱两可时,避免特别明确地使用是有道理的。
我并不是说你永远不应该回来None
,但总的来说,我认为这不是一个好主意。
您甚至可以在今天的 Python 中看到这一点,其中blah['DOESNOTEXIST']
将抛出异常,而在 Javamap.get("DOESNOTEXIST")
中将返回null
。