は、あなたが usesSubStatsがTrueで、キーがsubStatsにない場合はKeyError例外をスローする場合、またはusesSubStatsが Falseの場合とキーが統計ではありません。だから私はあなたが思うように/ elif/else chainingが動作しない場合、問題は だと思います。
は考えてみましょう:
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に真である、唯一の最初の分岐は、これまでテストされたバージョン:
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:'とする)が実行されます。。何が起こるかに応じて、次の支店に移動することはありません支店内。
、[Pythonのスタイルガイド](http://www.python.org/dev/peps/pep -0008 /)は、4-spaceインデントを使用することを示唆しています。これにより、コードが読みやすくなります。 – ThiefMaster
これはあなたが言ったことを正確にしています。確かにパーサーのせいではありません。 –