它是确定跳过“返回None”?

问题描述 投票:38回答:7

我不知道它是坏的方式跳过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

python function return-value
7个回答
58
投票

就像你说的,return None(几乎)从来没有需要。

但是,你应该考虑你的代码的意图是明确的return None更加清晰。记住:一段代码也需要通过人的生命是可读的,并且是明确的,通常会有所帮助。


25
投票

为了阐述对别人怎么说,我用一个return None如果函数应该返回一个值。在Python中,所有的函数返回一个值,但往往我们写的,只有再回到无功能,因为它们的返回值被忽略。在某些语言中,这些将被称为程序。

因此,如果一个函数应该返回一个值,然后我要确保所有代码路径有回报,这回报有一个值,即使它是无。

如果函数“不”返回一个值,也就是说,如果这是从来没有使用它的返回值有人叫,那么它的确定结束没有回报,如果我需要提前返回,我用的是裸露的形式, return


5
投票

Yes和No.

在最简单的情况下,它是确定跳过“返回None”,因为它没有返回只有单一的负面状态。

但是,如果有嵌套条件评估和多种方案,其中一个功能可以返回无。我倾向于把它们作为场景的视觉文档。

[编辑:基于评论如下]

返回或返回None

我更喜欢“回归无”裸“回报”,因为它是明确的,后来,没有人会怀疑,如果返回意味着返回无抑或是一个错误的东西不见了。


3
投票

是的,如果你不从Python函数返回任何值,返回None。因此,无论是明确地返回None是一个风格的决定。

就个人而言,我更喜欢总是清晰返回一个值。


1
投票

我想它的越少,我觉得你描述的情况下显示出良好的实践。它迫使客户区分,所以客户端代码几乎总是这样的:

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低(谁可能是你自己!)。树枝越少越好。


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

我不相信一半定义的功能,但这种假可在搜索类型的故障修剪有用。


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他们是绝对没有意义的和丑陋的。

© www.soinside.com 2019 - 2024. All rights reserved.