我想知道在不需要的情况下跳过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
。
答案 0 :(得分:57)
就像你说的那样,return None
几乎是不需要的。
但是你应该考虑使用明确的return None
更清楚你的代码的意图。请记住:一段代码也需要人类可读,并且明确通常会有所帮助。
答案 1 :(得分:24)
为了阐述其他人所说的内容,如果该函数应该返回一个值,我会使用return None
。在Python中,所有函数都返回一个值,但是我们经常编写只返回None的函数,因为它们的返回值被忽略。在某些语言中,这些称为程序。
因此,如果函数应该返回一个值,那么我确保所有代码路径都有一个返回值,并且返回值有一个值,即使它是None。
如果一个函数“没有”返回一个值,也就是说,如果某个人从未使用它的返回值调用它,那么没有返回就可以结束,如果我需要提前返回,我会使用裸露的形式,return
。
答案 2 :(得分:5)
是和否。
在最简单的情况下,可以跳过“return None”,因为它仅在单个负面条件下返回None。
但是如果存在嵌套条件评估和多个场景,其中函数可以返回None。我倾向于将它们包含为场景的可视化文档。
[编辑:根据以下评论]
返回或返回无
我更喜欢“返回无”以显示“返回”因为它是明确的,后来,如果返回意味着返回None,或者由于某些内容丢失而导致错误,则没有人会怀疑。
答案 3 :(得分:3)
是的,如果你没有从Python函数返回任何值,它将返回None。因此,是否明确返回None是一种风格决定。
就个人而言,为了清晰起见,我更愿意总是返回一个值。
答案 4 :(得分:0)
def foo1(x):
try:
return Baz(x)
except:
raise ValueError('Incorrect value fo Bac')
或
def foo3(x):
return Baz(x) if <condition> else False
我不相信半定义的函数,但是这个False在搜索类型失败修剪中很有用。
答案 5 :(得分:0)
我想的越多,我认为你所描述的案例就越少表现出良好的做法。它迫使客户端进行区分,因此客户端代码几乎总是如下:
b = foo1(123)
if b is not None:
...
你甚至不能写:
if b:
...
因为,如果Baz.__nonzero__
被覆盖,b可以评估为False,即使它不是None。最好有一个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低。分支越少越好。
答案 6 :(得分:0)
我不同意这里的很多答案。
显式胜于隐式,但有时在可读性上要少得多。
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
,因为它们绝对毫无意义且丑陋。