Python 跳过“行吗?”;返回“无”;?

Python 跳过“行吗?”;返回“无”;?,python,function,return-value,Python,Function,Return Value,我想知道在不需要时跳过返回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) 在这两种情况下,当条件为false时,函数将返回None是和否 在最简

我想知道在不需要时跳过
返回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)
在这两种情况下,当条件为false时,函数将返回
None

是和否

在最简单的情况下,跳过“return None”是可以的,因为它只在单个负条件下返回None

但是如果存在嵌套的条件求值和多个场景,其中一个函数可以不返回任何值。我倾向于将它们作为场景的可视化文档

[编辑:根据以下评论]

返回或不返回


我更喜欢“return None”而不是裸露的“return”因为它是显式的,以后,没有人会怀疑这个返回是否意味着返回None,或者它是一个错误,因为缺少了一些内容。

是的,如果您没有从Python函数返回任何值,它将返回None。因此,是否显式返回None是一个风格决定


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

就像你说的,
返回None
是(几乎)永远不需要的


但您应该考虑代码的意图更清楚,明确的<代码>返回NO/<代码>。请记住:一段代码也需要人类可读,而显式通常会有所帮助。

为了解释其他人所说的话,如果函数应该返回值,我使用
返回None
。在Python中,所有函数都返回一个值,但我们通常编写只返回一个值的函数,因为它们的返回值被忽略。在某些语言中,这些被称为过程

因此,如果一个函数应该返回一个值,那么我确保所有代码路径都有一个返回,并且该返回有一个值,即使它没有

如果函数“不”返回值,也就是说,如果某人从未使用它的返回值调用它,那么结束时不返回值是可以的,如果我需要提前返回,我使用裸格式,
return

def foo1(x):
    try:
        return Baz(x)
    except:
        raise ValueError('Incorrect value fo Bac')

def foo3(x):
如果为False,则返回Baz(x)

我不相信半定义函数,但这个False在搜索类型故障修剪中很有用。

我越是考虑它,我越不认为您描述的案例显示了良好的实践。它迫使客户端进行区分,因此客户端代码几乎总是如下所示:

b = foo1(123)
if b is not None:
    ...
你甚至不会写:

if b:
    ...
因为,如果覆盖了Baz.\uuuuuu非零\uuuuuuuuu,b的计算结果可能为False,即使它不是None。最好有一个
Null Baz
实例(AKA),例如:


关键是:帮助客户(可能是你自己!)保持低调。树枝越少越好

我不同意这里的许多答案。

显式比隐式好,但在可读性方面,有时越少越好

def get_cat():
    if cat_is_alive():
        return Cat()
# vs     

def get_cat():
    if cat_is_alive():
        return Cat()
    return None
在这个特定的示例中,您有两行额外的代码,它们实际上没有提供任何有用的信息,因为默认情况下所有函数都不返回任何值

此外,
return None
的明确性随着类型提示的使用而更加消失:

def get_cat() -> Union[Cat, None]:
    if cat_is_alive():
        return Cat()
包括
returnnone
这里有一个双重冗余:默认情况下返回None,并在类型提示标记中显式指示


我要避免拖尾
返回None
它们绝对是毫无意义和丑陋的。

也有助于“遵守”导入此
:p“显式优于隐式”。人们鹦鹉学舌地说“Python禅宗”让我不断地对评论投反对票。隐式比显式更清晰,避免了不必要的冗余。@dln385:不要
返回None
,除非None返回值本身有意义。
\uuuu init\uuuu
的返回值没有意义,因此不要显式返回None。如果您需要从
\uuuu init\uuuu
中间返回,只需说
return
,不要在函数末尾添加不必要的
return
。@Glenn Maynard:所以不需要显式,因为不打算返回任何内容。我的案子到此为止……:)即使使用嵌套,也可以使用
return
而不是
returnnone
。有时将
None
显式化会更清楚,但人们通常使用
None
来表示某种异常情况,在这种情况下,提出一个命名良好的异常会更好。@adw:我同意你的看法。其中一些是风格习惯。我讨厌仅仅使用“退货”,好像我错过了退货一样。在这种情况下,我更喜欢“不返回”,因为我明确表示这是我想要的。我个人不使用“无”来表示特殊价值,但通常使用它作为占位符来表示价值所在地。[]或()则表示结果的数量不定,对于某些类型的函数,它们的值类似于False,而不是返回None(因为None是不可iterable的)好的点。但在某些情况下,我被迫一个也不返回。在Django中间件中,大多数方法都不会返回任何结果。我对此投了反对票,因为即使建议在某些情况下有效,也超出了问题的范围。我会更进一步。我希望Python函数在默认情况下返回一个“No Value returned”对象,而不是None,并且如果您试图使用“No Value returned”对象(打印它、分配给变量等),Python会引发一个错误。这将捕捉到相当常见的错误,即人们忽略函数中的
返回。然后,如果调用确实返回
None
的函数,Python也可以更改为在命令行上显示
None
,或者如果函数不返回任何内容,则保持沉默。我是通过检查是否已经有人为此打气而来的,但是运气不好!
def get_cat():
    if cat_is_alive():
        return Cat()
# vs     

def get_cat():
    if cat_is_alive():
        return Cat()
    return None
def get_cat() -> Union[Cat, None]:
    if cat_is_alive():
        return Cat()