0

我有这样的方法:

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 解释器中的错误吗?方法不应该returnwinner值并退出方法而不是仍然移动到最后并返回None吗?我正在使用 Python 2.7.3

4

5 回答 5

4

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

您的第一个函数有一条可以到达终点的路径,如果不满足任何if条件,则避免显式returns. 发生这种情况时,它None默认返回。在第二个版本中,您可以通过以无条件return语句结束函数来避免此问题。这是我推荐的做法。

于 2012-09-08T02:14:12.583 回答
2

你搞砸了缩进,混合了制表符和空格。用于python -tt验证。除非你有理由让多个 if 语句为真,否则始终坚持使用 elif。

于 2012-09-08T02:09:39.623 回答
1

除了 Ignacio Vazquez-Abrams 的评论之外,在if/elif没有 else 的情况下使用一种块也被认为是不好的做法。

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

if spam:
    return eggs

确保你还有其他:

if spam:
    return eggs
else:
    return no_eggs
于 2012-09-08T02:12:26.983 回答
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 解释器中的错误 - 特别是这样一个灾难性的错误!一般来说,尽量保持控制流尽可能简单和清晰是避免此类问题的最佳方法。

于 2012-09-08T02:19:41.377 回答
0

您争辩说您已经涵盖了两个布尔值的所有四个可能值,因此该函数永远不会到达终点。

确实,如果你写了

a = carda.is_trump
b = cardb.is_trump

然后针对aand进行测试b,这将是正确的。但是,每次您通过点符号请求属性时,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
于 2012-09-08T02:44:01.323 回答