在类方法中始终使用'return'是最佳实践吗?

3

在接触过多种编程语言之后,我正在深入学习Python。从“pythonic”和最佳实践的角度来看,一个类的方法是否应该始终返回(即使是None)?在某些语言中,始终使用显式的返回语句是必需的(或者更好)。

例如,修改状态但不返回值的方法:

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

在函数结尾处是否应该有一个显式的返回语句?

1
有一件事:你永远不需要 else: pass,因为如果你把它省略掉,同样的事情也会发生。 - zondo
可能是Python - return,return None和没有返回的重复问题。 - Reti43
还要注意,PEP0008指出:“在返回语句中保持一致性。函数中的所有返回语句都应该返回一个表达式,或者都不返回。如果任何返回语句返回一个表达式,则任何没有返回值的返回语句都应明确声明为return None,并且在函数末尾(如果可达)应该存在一个显式的返回语句。” - Reti43
4个回答

3

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

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/


1
一个方法应该只设置一个属性或返回一个值,而不是同时进行。所以你的方法完全符合 Pythonic 风格。
def change_player():
    if self._player == 'X':
        self._player = 'Y'
    elif self._player == 'Y'
        self._player = 'X'

我认为OP的问题是关于函数是否应该以裸的return结束,而不是他是否应该返回某个值。 - Martin Bonner supports Monica
@MartinBonner 我认为答案已经解决了这个问题。一个方法应该只设置属性或返回值,而不是同时进行两者。 - erip
@erip:但是def set_attr(self, x): self.attr = x; return“只设置一个属性”。问题是最后的return是否需要。 - Martin Bonner supports Monica

1

不一定需要返回语句。

至于是否在代码中包含返回语句是好的风格,我会说不需要 - 但这基本上是个人观点的问题。


1
当一个函数修改了某个东西,它就会产生副作用。Python是一种灵活的语言,允许你按照一定的限制自己的方式进行操作。然而,一个函数应该专注于做一些非常简短的事情,例如:
  • 接收一个参数,对其进行处理,然后返回新值
  • 接收一个参数,使用该值来修改某些东西,并在过程失败时引发异常。
  • 不接收任何内容,修改某些东西,并在出现错误时引发异常或至少返回一个标志(即整数)以通知函数的状态。

最好返回某些内容或引发异常,以始终知道函数是否有效,以避免悄无声息的错误/副作用。在严格的函数式编程中,函数不应该产生任何形式的副作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接