<p>如果你想正确地理解错误
usesSubStats为True,并且key不在subStats中,或者如果usesSubStats为
False和key不在stats中。所以我认为问题是
如果/elif/else链接不能像您认为的那样工作。你知道吗</p>
<p>考虑:</p>
<pre><code>def f(x):
if x == 1:
return 'first'
elif x == 2:
return 'second'
else:
return 'other'
</code></pre>
<p>产生</p>
<pre><code>>>> f(1), f(2), f(3), f(4)
('first', 'second', 'other', 'other')
</code></pre>
<p>我希望它能达到预期的效果,这是你应该记住的模式。因为在测试代码中useSubStats为True,所以只测试第一个分支:</p>
<pre><code>def condition(lab, val):
print('testing condition', lab);
return val
def g():
if condition(1, True):
return 'first branch'
elif condition(2, False):
return 'second branch'
else:
return 'other branch'
return 'fallthrough'
>>> g()
testing condition 1
'first branch'
</code></pre>
<p>所以你的代码是这样的:</p>
<pre><code>def h():
if condition(1, True):
if condition('1b', False):
return 'first branch'
elif condition(2, False):
return 'second branch'
else:
return 'other branch'
return 'fallthrough'
>>> h()
testing condition 1
testing condition 1b
'fallthrough'
</code></pre>
<p>我不太确定你认为它应该如何表现,但似乎你期望在“如果”键输入之后自身子状态“测试失败,执行应该移回if/elif/else分支的下一个成员上一级并测试它。不过,这根本不是它的工作原理。你知道吗</p>
<p>有几种简单的方法可以得到你想要的行为:一种是把它展平,这样它就可以</p>
<pre><code> if CharacterStats.usesSubStats and key in self.subStats:
</code></pre>
<p>相反,它的计算结果将为False,因此下一个分支<em>将</em>进行测试,或者——正如您自己发现的那样——使elif成为if,这再次导致该条件被独立测试,或者像前面的答案一样重写。你知道吗</p>
<p>这有道理吗?if/elif/else列表描述了一系列的可能性,条件按顺序测试,<em>并且只执行与第一个真条件相对应的分支(将最后的else作为'elif 1:')</em>。根据分支中发生的情况,不能移动到下一个分支。你知道吗</p>