跳过“返回无”可以吗?

时间:2010-10-26 20:12:38

标签: python function return-value

我想知道在不需要的情况下跳过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

7 个答案:

答案 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,因为它们绝对毫无意义且丑陋。