Python indentation in "empty lines"

Question:

Which is preferred (“.” indicating whitespace)?

A)

def foo():
    x = 1
    y = 2
....
    if True:
        bar()

B)

def foo():
    x = 1
    y = 2

    if True:
        bar()

My intuition would be B (that’s also what vim does for me), but I see people using A) all the time. Is it just because most of the editors out there are broken?

Asked By: nisc

||

Answers:

Emacs does B) for me, but I really don’t think it matters. A) means that you can add in a line at the correct indentation without any tabbing.

Answered By: Skilldrick

That empty line belongs to foo(), so I would consider A to be the most natural. But I guess it’s just a matter of opinion.

Answered By: T .

I wouldn’t necessarily call the first example “broken”, because I know some people hate it when the cursor “jumps back” when moving the cursor up or down in code. E.g. Visual Studio (at least 2008) automatically prevents this from happening without using any whitespace characters on those lines.

Answered By: Deniz Dogan

If you use A, you could copy paste your block in python shell, B will get unexpected indentation error.

Answered By: YOU

The PEP 8 does not seem to be clear on this issue, although the statements about “blank lines” could be interpreted in favor of B. The PEP 8 style-checker (pep8.py) prefers B and warns if you use A; however, both variations are legal. My own view is that since Python will successfully interpret the code in either case that this doesn’t really matter, and trying to enforce it would be a lot of work for very little gain. I suppose if you are very adamantly in favor of one or the other you could automatically convert the one to the other. Trying to fix all such lines manually, though, would be a huge undertaking and really not worth the effort, IMHO.

My experience in open-source development is that one should never leave whitespace inside blank lines. Also one should never leave trailing white-space.

It’s a matter of coding etiquette.

Answered By: wm_eddie

TextMate breaks block collapsing if you use B, and I prefer A anyway since it’s more “logical”.

Answered By: o0'.

Adding proper indentation to blank lines (style A in the question) vastly improves code readability with display whitespace enabled because it makes it easier to see whether code after a blank line is part of the same indentation block or not.

For a language like Python, where there is no end statement or close bracket, I’m surprised this is not part of PEP. Editing Python with display whitespace on is strongly recommended, to avoid both trailing whitespace and mixed indentation.

Compare reading the following:

A)

def foo():
....x = 1
....y = 2
....
....if True:
........bar()

B)

def foo():
....x = 1
....y = 2

....if True:
........bar()

In A, it is far clearer that the last two lines are part of foo. This is even more useful at higher indentation levels.

Answered By: Zags

vi implicitly discourages the behaviour in A because the {/} navigations no longer work as expected. git explicitly discourages it by highlighting it in red when you run git diff. I would also argue that if a line contains spaces it is not a blank line.

For that reason I strongly prefer B. There is nothing worse than expecting to skip six or so lines up with the { motion and ending up at the top of a class def.

Answered By: Score_Under

B is preferred – i.e. no indentation. PEP 8 says:

Avoid trailing whitespace anywhere. Because it’s usually invisible, it can be confusing […] Some editors don’t preserve it and many projects (like CPython itself) have pre-commit hooks that reject it.

Answered By: wjandrea
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.