大多数pythonic的功能方式没有回报?

时间:2012-11-09 11:20:52

标签: python pep8

我在PEP 8中找不到任何相关的内容。我对你对功能最无效的语法感兴趣吗?

有没有理由阻止没有返回线的函数(例3)?

示例1:

def foo():
   print 'foo'
   return None

示例2:

def foo():
   print 'foo'
   pass

示例3:

def foo():
   print 'foo'

5 个答案:

答案 0 :(得分:17)

保持简单。例3是最pythonic的方式。

>>> import this

The Zen of Python, by Tim Peters

...
Simple is better than complex.
...

答案 1 :(得分:14)

有两种用例:

  • 一个永不返回任何东西的函数(a.k.a“procedure”)。你应该完全省略退货。
  • 对某些输入返回None的函数。我个人更喜欢把return None放在那里,否则可能会让读者感到有些困惑:

示例:

 def find_user(name):
     if database.is_ready():
        return database.find_user_by_name(name)
     else:
        return None

从技术上讲,您可以删除else部分,但这会使该功能看起来令人困惑。

答案 2 :(得分:7)

如果你的函数返回一个值,可能None是某种情况,return None是好的。

如果您的函数没有返回值,但您希望提前返回,请使用return而不使用任何参数。在最后一行,您可以省略它。

pass什么都不做,只有在需要声明语法错误时才会有用(例如在空类中)

答案 3 :(得分:6)

PEP8就此主题提出了建议:

  

在回复陈述中保持一致。函数中的所有返回语句应该返回一个表达式,或者 none 。如果任何return语句返回一个表达式,那么任何没有返回值的return语句都应该明确地将其声明为return None,并且在函数末尾应该有一个显式的return语句(如果可以访问)。

是:

def foo(x):
    if x >= 0:
        return math.sqrt(x)
    else:
        return None

def bar(x):
    if x < 0:
        return None
    return math.sqrt(x)

没有

def foo(x):
    if x >= 0:
        return math.sqrt(x)

def bar(x):
    if x < 0:
        return
    return math.sqrt(x)

答案 4 :(得分:-1)

正如其他人所说,选项3是迄今为止最好的。

更多的原因选项3是一个好主意,许多人认为None(在其他语言中称为null)通常不应该被退回,并且你应该扔掉一个异常或使用Null对象模式。虽然我并不完全同意这一点,但我认为有一些有效的观点可以避免在语义上没有意义且含糊不清时特别明确地使用None

我不是说你永远不应该回归None,但总的来说,我认为这不是一个好主意。

您甚至可以在今天的Python中看到这一点,其中blah['DOESNOTEXIST']将抛出异常,其中Java map.get("DOESNOTEXIST")将返回null