2010-10-26 71 views
33

我不知道在不需要时跳过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返回。

回答

50

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

但是你应该考虑你的代码的意图明确的return None更清晰。请记住:一段代码也需要被人类读取,并且明确地通常是有帮助的。

+1

也有助于符合'import this':P – 2010-10-26 20:19:55

+0

关于'__init__'方法的结尾?既然你不能'返回None',那么最好是有'return'还是什么也不做? – dln385 2010-10-26 20:32:34

+0

@ dln385:你可以在__init__中返回None,实际上这就是return的作用。 – adw 2010-10-26 20:35:46

4

是和

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

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

[编辑:基于下面的评论]

return or return None

我喜欢“回归无”裸“返回”,因为它是明确的,后来,没有人会怀疑,如果返回意味着返回没有或者是错过了一些错误。

+0

即使嵌套,你可以使用'return'而不是'return None'。有时候可以更清楚地说明“无”,但通常人们使用“无”来表示某种特殊情况,在这种情况下,提出明确的例外情况会更好。 – adw 2010-10-26 20:24:06

+0

@adw:我同意你的看法。其中一些是风格习惯。我憎恶使用“返回”,就好像我错过了返回的东西。在这种情况下,我更愿意“返回无”,因为我明确表示这是我想要的。 – pyfunc 2010-10-26 20:37:22

+0

我个人不会将“无”用于特殊价值,但通常用它作为占位符来指示有价值的位置。 []或()然后指示结果数量不确定,对于某种功能它们更好False-like value than return无(因为None不可迭代) – 2010-10-26 21:02:18

2

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

就个人而言,我更愿意为了清晰而始终返回一个值。

21

来阐述对别人怎么说,我用一个return None如果函数应该返回一个值。在Python中,所有函数都会返回一个值,但是我们经常编写只返回None的函数,因为它们的返回值被忽略。在某些语言中,这些将被称为程序。

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

如果一个函数“不”返回一个值,也就是说,如果它从来没有被某个人用它的返回值调用,那么没有返回就可以结束,如果我需要提前返回,我使用裸露的表格,return

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

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

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

好点。但在某些情况下,我不得不返回None。 IE浏览器。在Django中间件中,您将在大多数方法中返回None。 – 2010-10-29 06:54:44

+0

我低估了这一点,因为即使该建议在某些情况下有效,它也不在问题的范围之内。 – ehabkost 2017-05-29 17:09:57