如果我理解正确,你想抛出一个 KeyError 如果
usesSubStats 为 True 且 key 不在 subStats 中,或者如果 usesSubStats 为
错误和关键不在统计数据中。所以我认为问题在于
if/elif/else 链接不像你想象的那样工作。
考虑:
def f(x):
if x == 1:
return 'first'
elif x == 2:
return 'second'
else:
return 'other'
生产
>>> f(1), f(2), f(3), f(4)
('first', 'second', 'other', 'other')
我希望它符合预期,并且是您应该牢记的模式。由于在您的测试代码中 useSubStats 为 True,因此只测试了第一个分支:
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'
所以你的代码是这样的:
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'
我不确定您认为它应该如何表现,但您似乎希望在“if key in self.subStats”测试失败后,执行应该移回 if/elif 的下一个成员/else 向上分支一级并进行测试。但这根本不是它的工作原理。
有几种简单的方法可以获得您想要的行为:一种是将其展平,使其成为
if CharacterStats.usesSubStats and key in self.subStats:
相反,它将评估为 False,因此将测试下一个分支 ,或者 - 正如您自己发现的那样 - 将 elif 设为 if,这再次导致该条件被独立测试, 或像之前的答案一样重写。
这有意义吗? if/elif/else 列表描述了一系列的可能性,条件依次测试,只有第一个真正的条件对应的分支(以最后的 else 为 'elif 1:')被执行。您不会移动到下一个分支,具体取决于分支内发生的情况。