如果我理解正確的話,你想拋出一個KeyError異常,如果 usesSubStats是真正的和關鍵不在subStats或者usesSubStats是 假和關鍵不在統計。所以我認爲問題在於如果/ 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 self.subStats中的鍵」測試失敗之後,執行應該返回到上一級的if/elif/else分支的下一個成員並測試它。但是,這根本不是它的工作方式。
有幾種簡單的方法來得到你想要的行爲:一個就是擊敗它,這樣它的
if CharacterStats.usesSubStats and key in self.subStats:
代替,這將評估爲False,因此下一個分支將進行測試,或 - 當你發現自己 - 讓elif變成一個if,這又會導致這種情況被獨立測試,或者如之前的答案那樣重寫。
這有道理嗎?if/elif/else列表描述了一系列可能性,其中條件依次測試,並且僅執行對應於第一個真實條件的分支(將最終else取爲'elif 1:')被執行。你不會移動到下一個分支,這取決於在分支內發生了什麼。
來源
2011-12-10 13:55:08
DSM
僅供參考,[蟒蛇風格指南](http://www.python.org/dev/peps/pep -0008 /)建議使用4空格縮進 - 這使您的代碼更具可讀性。 – ThiefMaster
它正在做你已經告訴過的。這當然不是解析器的錯。 –