我正试着为我一直在做的一个小程序写一个类,结果我遇到了一个奇怪的缩进失败。我想知道我写的东西是否真的有问题,或者是解析器的错。这在Fedora15的Python3.2包中失败。你知道吗
def __getitem__(self, key):
if CharacterStats.usesSubStats:
if key in self.subStats:
return self.subStats[key]
elif key in self.stats: #change this to 'if' and it works
return self.stats[key]
else:
raise KeyError(key)
#otherwise we end up right here.
当且仅当
CharacterStats.usesSubStats
为真且key in self.subStats
为假时,您可以结束在标记为otherwise we end up right here
的行上。你知道吗当您将
elif
更改为if
时,就消除了这种可能性:代码永远无法到达otherwise we end up right here
行。你知道吗很难说这两个版本中哪一个是正确的。如果我猜对了你的意图,也许下面的两种方法都会更清楚:
如果你想正确地理解错误 usesSubStats为True,并且key不在subStats中,或者如果usesSubStats为 False和key不在stats中。所以我认为问题是 如果/elif/else链接不能像您认为的那样工作。你知道吗
考虑:
产生
我希望它能达到预期的效果,这是你应该记住的模式。因为在测试代码中useSubStats为True,所以只测试第一个分支:
所以你的代码是这样的:
我不太确定你认为它应该如何表现,但似乎你期望在“如果”键输入之后自身子状态“测试失败,执行应该移回if/elif/else分支的下一个成员上一级并测试它。不过,这根本不是它的工作原理。你知道吗
有几种简单的方法可以得到你想要的行为:一种是把它展平,这样它就可以
相反,它的计算结果将为False,因此下一个分支将进行测试,或者——正如您自己发现的那样——使elif成为if,这再次导致该条件被独立测试,或者像前面的答案一样重写。你知道吗
这有道理吗?if/elif/else列表描述了一系列的可能性,条件按顺序测试,并且只执行与第一个真条件相对应的分支(将最后的else作为'elif 1:')。根据分支中发生的情况,不能移动到下一个分支。你知道吗
我认为你应该用
raise
缩进#otherwise..
,因为后者在一个最终的else
中,而且“外部块”永远不会到达。。因此,我认为这是一个合理的压痕误差。你知道吗相关问题 更多 >
编程相关推荐