YPCrumble
YPCrumble

Reputation: 28682

Is it best practice to include an else: pass statement at the end of a Python if or if/elif statement?

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?

Upvotes: 6

Views: 11524

Answers (3)

Martijn Pieters
Martijn Pieters

Reputation: 1121834

No, it isn't, the else suite is entirely optional.

From the if statement documentation:

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
... ''', '<stdin>', '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
... ''', '<stdin>', '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.

Upvotes: 18

Hewey Dewey
Hewey Dewey

Reputation: 149

Don't ignore a 'better practice' even though there may be no 'best practice'.

An 'else:' clause certainly is not required, however... Logic and syntax rules aside, using an 'if-elif-elif-elif...else: pass' block provides the perfect opportunity for the author to document what conditions have NOT yet been met after possibly many if-elif checks. In the future should an unexpected 'corner case' raise its ugly head this bit of documentation may very well help to find the bug.

Upvotes: 4

Jojodmo
Jojodmo

Reputation: 23596

There is no need to put else after an if, or an elif statement. The only place that you would need to use one is if you want to do something if the if statement was not true. For example:

if a == b:
    myString = "true"
else:
    myString = "false";

Upvotes: 1

Related Questions