PyCQA / PyCQA/pycodestyle

E126: Problem with bad hanging & visual indents

Open
#738 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
5.2k
Forks
754
PR merge metrics
No merged PRs in 30d

Description

While trying to work out the kinks in my attempted fix for issue #667, I realised the indentation checks are more broken than I expected.

This test is in the test suite:

#: E126 E126
rv.update(dict.fromkeys((
            'qualif_nr', 'reasonComment_en', 'reasonComment_fr',
            'reasonComment_de', 'reasonComment_it'),
        '?'),
    "foo")

Currently this test passes, but it shouldn't. With the following line numbers (don't know how to make line nums show up in github code blocks?):

1 rv.update(dict.fromkeys((
2            'qualif_nr', 'reasonComment_en', 'reasonComment_fr',
3            'reasonComment_de', 'reasonComment_it'),
4        '?'),
5    "foo")

pycodestyle reports E126 (continuation line over-indented for hanging indent) for lines 2 and 4, and no other errors, and so the test passes. But looking at the PEP 8 guidelines on hanging indents:

When using a hanging indent the following should be considered; there should be no arguments on the first line...

Since three bracketed blocks are opened on line 1, only the innermost one should qualify as a possible hanging indent. So lines 2 and 3 are over-indented hanging indents and should report E126 (currently 2 does and 3 doesn't).

Lines 4 and 5 can't be hanging indents as each of their bracket-blocks' first arguments begin on the same line as their opening bracket (i.e. line 1). Hence line 4 is erroneously reported as E126, and both of these lines should be reported as under-indented visual indents (E128), which neither of them currently are (5 gets no report, 4 gets the erroneous E126 as mentioned).

As a sanity-check, I ran pylint on the above file, which flagged "wrong hanging indentation" for lines 2 and 3, and "wrong continued indentation" for lines 4 and 5, which matches with my reasoning above.

I think this might need a fairly substantial rewrite of the continued_indentation check and associated tests. I don't have any time in the next week, but if nobody else takes it on I would be happy to have a look at it when I have time.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the continued_indentation check and its associated tests, then reproduce the issue's multiline rv.update example. Compare the reported diagnostics with the described expectations: E126 on lines 2 and 3, and E128 on lines 4 and 5; update the tests to capture the corrected behavior.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
tooling
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
42/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.