我有一个这样的方法:
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
答案 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
然后针对a
和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