If I write:
if a == b:
# do something
elif a == c:
# do something else
and I just want to pass otherwise, is writing out the following required at the end?:
else:
pass
It seems to run fine without the else: statement in the interpreter, is there a reason I'm not aware of that I should always include else: pass in these cases?
解决方案
No, it isn't, the else suite is entirely optional.
if_stmt ::= "if" expression ":" suite
( "elif" expression ":" suite )*
["else" ":" suite]
where (...)* means zero or more, and [...] means optional. So a valid if compound statement has an if line and suite, 0 or more elif lines and corresponding suites, and at most one else line and suite, which is optional.
The Python compiler will ignore any else: pass block, there is really no point in including it:
>>> import dis
>>> dis.dis(compile('''\
... if True:
... foo
... else:
... pass
... ''', '', 'exec'))
1 0 LOAD_NAME 0 (True)
3 POP_JUMP_IF_FALSE 13
2 6 LOAD_NAME 1 (foo)
9 POP_TOP
10 JUMP_FORWARD 0 (to 13)
4 >> 13 LOAD_CONST 0 (None)
16 RETURN_VALUE
>>> dis.dis(compile('''\
... if True:
... foo
... ''', '', 'exec'))
1 0 LOAD_NAME 0 (True)
3 POP_JUMP_IF_FALSE 13
2 6 LOAD_NAME 1 (foo)
9 POP_TOP
10 JUMP_FORWARD 0 (to 13)
>> 13 LOAD_CONST 0 (None)
16 RETURN_VALUE
where the only difference is the line number attached to the LOAD_CONST bytecode because of the extra lines in the first source sample.
Stylistically, else: pass is just clutter, something to reduce readability.