【问题标题】:Is it best practice to always 'return' from a class method始终从类方法“返回”是最佳实践吗
【发布时间】:2016-03-13 17:11:58
【问题描述】:

在使用过其他几种语言后,我正在深入研究 Python。为了成为“pythonic”并且从最佳实践的角度来看,一个类的方法是否应该总是返回(即使没有)?在某些语言中,需要(或首选)始终具有明确的 return 语句。

例如,一个改变状态但不完全返回值的方法:

def change_player():
    if self._player == 'X':
        self._player = 'Y'
    elif self._player == 'Y'
        self._player = 'X'
    else: 
        pass

在函数结束时这里应该有一个显式的return语句吗?

【问题讨论】:

  • 有一件事:你永远不需要else: pass,因为如果你把它排除在外,同样的事情也会发生。
  • 还要注意PEP0008“在return语句中保持一致。函数中的所有return语句都应该返回一个表达式,或者它们都不应该。如果任何return语句返回一个表达式, 任何没有返回值的 return 语句都应该明确地将 this 声明为 return None ,并且明确的 return 语句应该出现在函数的末尾(如果可以访问)。”

标签: python methods


【解决方案1】:

通常应该使用异常而不是返回码来指示错误。如果您期望函数或方法有某种输出,则返回值是可以接受的。您的代码应该如下所示:

def change_player(self):
    if self._player == 'X':
        self._player = 'Y'
    elif self._player == 'Y':
        self._player = 'X'
    else: 
        raise ValueError 

这里有一些关于如何在 Python 中使用异常是一种更简洁的处理方式的讨论:http://jeffknupp.com/blog/2013/02/06/write-cleaner-python-use-exceptions/

【讨论】:

    【解决方案2】:

    一个方法应该要么设置一个属性,要么返回一个值,而不是同时设置。所以你的方法完全是pythonic。

    def change_player():
        if self._player == 'X':
            self._player = 'Y'
        elif self._player == 'Y'
            self._player = 'X'
    

    【讨论】:

    • 我认为 OP 是在询问函数是否应该以 return 结尾。 (不是他是否应该返回一些值。)
    • @MartinBonner 我认为答案已经解决了。 一个方法应该设置一个属性或者返回一个值,而不是同时设置。
    • @erip:但def set_attr(self, x): self.attr = x: return“只设置一个属性”。问题是最后的return是否可取。
    【解决方案3】:

    当然不需要返回语句。

    至于包含一个是否是好的风格,我会说不 - 但这基本上是一个见仁见智的问题。

    【讨论】:

      【解决方案4】:

      当一个函数修改某些东西时,它有一个副作用。 Python 是一种灵活的语言,它允许您按照自己的方式做事,达到一定的限度。但是,一个函数应该专门做一些非常简短的事情,例如:

      • 接收一个参数,用它做一些事情,然后返回新值
      • 接收参数,使用该值修改某些内容,并引发 如果该过程不成功,则例外。
      • 不接收任何内容,修改某些内容,并在出现错误时引发异常,或者至少返回一个标志(即整数)来通知函数的状态。

      返回某些内容或引发异常以始终了解函数是否有效以避免安静的错误/副作用是一个好主意。在严格的函数式编程中,函数根本不应该产生任何副作用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-12
        • 2020-01-25
        • 1970-01-01
        • 1970-01-01
        • 2015-07-27
        • 1970-01-01
        相关资源
        最近更新 更多