Python方法返回。口译员错误?

时间:2012-09-08 02:06:56

标签: python

我有一个这样的方法:

def _play(self):
    carda = self._carda
    cardb = self._cardb

    if carda.is_trump and cardb.is_trump:
        winner = self._winbyrank() 
        return winner

    if not carda.is_trump and not cardb.is_trump:
        if carda.suite == cardb.suite:
            winner = self._winbyrank()
            return winner
        else:
            winner = self._winbyfirst()
            return winner

    if carda.is_trump and not cardb.is_trump:
        winner = self._winbytrump()
        return winner
    elif not carda.is_trump and cardb.is_trump:
        winner = self._winbytrump()
        return winner

偶尔会 (并且让我无法预料)返回None。当我用以下内容替换它时,修复了问题。

def _play(self):
    carda = self._carda
    cardb = self._cardb

    if carda.is_trump and cardb.is_trump:
        winner = self._winbyrank() 

    if not carda.is_trump and not cardb.is_trump:
        if carda.suite == cardb.suite:
            winner = self._winbyrank()
        else:
            winner = self._winbyfirst()

    if carda.is_trump and not cardb.is_trump:
        winner = self._winbytrump()
    elif not carda.is_trump and cardb.is_trump:
        winner = self._winbytrump()

    return winner

这不是Python解释器中的错误吗?方法return不应该winner值并退出方法而不是仍然移动'直到结束并返回None?我正在使用Python 2.7.3

5 个答案:

答案 0 :(得分:4)

答案是“Python中常用的部分是否存在错误,例如从函数返回值?”几乎可以肯定会是“不”。

如果没有满足if条件,则第一个函数有一个可以到达结尾的路径,避免使用显式return。发生这种情况时,默认情况下会返回None。通过使用无条件return语句结束函数,可以在第二个版本中避免此问题。这是我推荐的做法。

答案 1 :(得分:2)

你已经缩减了你的缩进,混合标签和空格。使用python -tt进行验证。并且在整个过程中坚持使用elif,除非你有理由不止一个if声明是真的。

答案 2 :(得分:1)

除了Ignacio Vazquez-Abrams的评论之外,如果没有其他的if/elif块,也被认为是不好的做法。

所以,如果你有这样的事情:

if spam:
    return eggs

确保你还有其他:

if spam:
    return eggs
else:
    return no_eggs

答案 3 :(得分:1)

这不是None返回问题的答案,但您可以大大简化控制流程:

if carda.suite == cardb.suite: #if suites are the same, no need to check trumps
    winner = self._winbyrank()
elif carda.is_trump or cardb.is_trump: #different suites so only one can be trump
    winner = self._winbytrump()
else: #since neither of the above triggered, they are different non-trump suites
    winner = self._winbyfirst()

这本身应该照顾流浪路径(如果你的压痕很好的话,不是我看到的。)

我更倾向于相信你的一个条件中存在一个错误,而不是Python解释器 - 特别是这样一个灾难性的错误!一般而言,尽量避免控制流程尽可能简单明了是避免此类问题的最佳方法。

答案 4 :(得分:0)

你认为你已经涵盖了两个布尔值的所有四个可能值,因此函数永远不会到达终点。

确实,如果你写过

a = carda.is_trump
b = cardb.is_trump

然后针对ab进行测试,这是真的。但是, Python会在每次请求时重新查找属性,通过点表示法。不仅如此,查找属性可以返回任意Python代码的值(由于属性的存在)。因此,没有理由通过函数使值保持不变。


一个简单的反例:

>>> class Card(object):
...     def __init__(self):
...             self.trump = False
...     
...     @property
...     def is_trump(self):
...             self.trump = not self.trump
...             return self.trump
... 
>>> carda = Card()
>>> carda.is_trump
True
>>> carda.is_trump
False