我不知道它是坏的方式跳过return None
,在不需要的时候了。
例:
def foo1(x):
if [some condition]:
return Baz(x)
else:
return None
def foo2(x):
if [some condition]:
return Baz(x)
bar1 = foo1(x)
bar2 = foo2(x)
在这两种情况下,当条件为假,函数将返回None
。
就像你说的,return None
(几乎)从来没有需要。
但是,你应该考虑你的代码的意图是明确的return None
更加清晰。记住:一段代码也需要通过人的生命是可读的,并且是明确的,通常会有所帮助。
为了阐述对别人怎么说,我用一个return None
如果函数应该返回一个值。在Python中,所有的函数返回一个值,但往往我们写的,只有再回到无功能,因为它们的返回值被忽略。在某些语言中,这些将被称为程序。
因此,如果一个函数应该返回一个值,然后我要确保所有代码路径有回报,这回报有一个值,即使它是无。
如果函数“不”返回一个值,也就是说,如果这是从来没有使用它的返回值有人叫,那么它的确定结束没有回报,如果我需要提前返回,我用的是裸露的形式, return
。
Yes和No.
在最简单的情况下,它是确定跳过“返回None”,因为它没有返回只有单一的负面状态。
但是,如果有嵌套条件评估和多种方案,其中一个功能可以返回无。我倾向于把它们作为场景的视觉文档。
[编辑:基于评论如下]
返回或返回None
我更喜欢“回归无”裸“回报”,因为它是明确的,后来,没有人会怀疑,如果返回意味着返回无抑或是一个错误的东西不见了。
是的,如果你不从Python函数返回任何值,返回None。因此,无论是明确地返回None是一个风格的决定。
就个人而言,我更喜欢总是清晰返回一个值。
我想它的越少,我觉得你描述的情况下显示出良好的实践。它迫使客户区分,所以客户端代码几乎总是这样的:
b = foo1(123)
if b is not None:
...
你甚至不能写:
if b:
...
因为,如果Baz.__nonzero__
被覆盖,B可以评价为False,即使它不是无。这将是最好有一个Null-Baz
实例(AKA Null Object),例如:
class Baz(object):
def some_method(self):
"""some action:"""
...
...
class BazNull(Baz):
def some_method(self):
"""nothing happens here"""
...
Baz.Null = BazNull()
...
def foo1(x):
if some_condition:
return Baz(x)
else:
return Baz.Null
...
b = foo1(123)
b.some_method()
问题的关键是:帮助客户保持Cyclomatic Complexity低(谁可能是你自己!)。树枝越少越好。
def foo1(x):
try:
return Baz(x)
except:
raise ValueError('Incorrect value fo Bac')
要么
def foo3(x):
return Baz(x) if <condition> else False
我不相信一半定义的功能,但这种假可在搜索类型的故障修剪有用。
我不同意很多在这里的答案。 明确优于隐式,但有时少即是多,当谈到可读性。
def get_cat():
if cat_is_alive():
return Cat()
# vs
def get_cat():
if cat_is_alive():
return Cat()
return None
在这个特殊的例子,你有2条额外的线路,真正提供任何有益的信息,因为所有的功能在默认情况下返回None。
此外return None
的明确性与类型提示的使用更是消失:
def get_cat() -> Union[Cat, None]:
if cat_is_alive():
return Cat()
这里包括return None
是双冗余:无默认情况下返回,它明确地表示在类型提示标记。
恕我直言,避免尾随return None
他们是绝对没有意义的和丑陋的。