有一个不以return语句结尾的函数是pythonic吗?

时间:2016-05-23 20:10:53

标签: python python-3.x

在python 3中,我写了类似下面的内容,感到很惊讶/很高兴它有用,并想知道这是不是很好的形式,或者是否有更好的写作方式:

def func_name(myargument):
    if myargument.check():
        return "something meaningful"
    try:
        return myargument.somemethod()
    except myError:
        print("some helpful message")
        raise

6 个答案:

答案 0 :(得分:1)

您的示例将使用显式返回或抛出异常 - 它永远不会到达函数的末尾 - 因此我不确定您的问题是否符合您的具体示例。

除此之外,我通常会尝试避免依赖于隐式return None的函数;它会像其他语言一样使代码审阅者感到困惑,缺乏回报是void函数。

请记住,一般来说,阅读代码比编写代码要多得多,所以在六个月的时间内将其编写为可读...

答案 1 :(得分:1)

没有结束回报是好的。

虽然我很困惑你为什么"检查" myargugument两次基本上......一次在check()中,一次尝试。

你能简化为:

try:  
   return myargument.somemethod()  
except myError as e:  
   print("some helpful message")  
   raise  
else:
  return "something meaningful"  

基于.check()是一种廉价的旗帜检查,您可能还想考虑使用Python"三元运算符":

try:  
   return "something meaningful" if myargument.check() else myargument.somemethod()  
except myError as e:  
   print("some helpful message")  
   raise  

答案 2 :(得分:1)

最接近官方" Pythonic"指导是PEP 8。它说:

  

在回复陈述中保持一致。 a中的所有返回语句   函数应该返回一个表达式,或者它们都不应该。如果有的话   return语句返回一个表达式,任何返回语句都没有   返回的值应该明确地将其声明为返回None,和   显式return语句应该出现在函数的末尾   (如果可以到达的话)。

在这种特殊情况下,我认为你所拥有的很好,因为函数的结尾是不可达的。

就个人而言,我会在尝试之前添加一个else语句,以澄清这是一个if / else情况。

答案 3 :(得分:1)

PEP8建议return statements should be consistent

  

在回复陈述中保持一致。 a中的所有返回语句   函数应该返回一个表达式,或者它们都不应该。如果有的话   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)

在考虑使用/不使用return编写函数的方法时,您可以考虑以下内容:

  1. 如果你的函数将修改它的任何参数,那么没有返回值是合适的,因为返回一个值可能会让人感到困惑。想想容器的就地变异。

  2. 如果函数应该在None条件下返回可用值,但是条件没有通过,则可以使用返回True。如果找不到合适的匹配项,请考虑正则表达式模式match

  3. 返回一个可用的对象(是的,python是关于对象的),如果该函数不会修改它的参数,而是使用它们来创建返回的对象。考虑sum内置的其他内容。

  4. 您可能需要考虑其他事项,但要确保function遵守Python的禅宗,尤其是:

      

    如果实施难以解释,那就不好了。

答案 5 :(得分:0)

好的,基于我收到的好建议,我认为以下内容对我有用:

    def func_name( myargument ):
       if myargument.check():
          return_value = "something meaningful"
       else:
          try:
             return_value = myargument.somemethod()
          except myError :
             print("some helpful message")
             return_value = None
             raise
    return return_value