You can use autopep8! Whilst you make yourself a cup of coffee this tool happily removes all those pesky PEP8 violations which don't change the meaning of the code.
Install it via pip:
pip install autopep8
Apply this to a specific file:
autopep8 py_file --in-place
or to your project (recursively), the verbose option gives you some feedback of how it's going:
autopep8 project_dir --recursive --in-place --pep8-passes 2000 --verbose
Note: Sometimes the default of 100 passes isn't enough, I set it to 2000 as it's reasonably high and will catch all but the most troublesome files (it stops passing once it finds no resolvable pep8 infractions)...
At this point I suggest retesting and doing a commit!
If you want "full" PEP8 compliance: one tactic I've used is to run autopep8 as above, then run PEP8, which prints the remaining violations (file, line number, and what):
pep8 project_dir --ignore=E501
and manually change these individually (e.g. E712s - comparison with boolean).
Note: autopep8 offers an --aggressive argument (to ruthlessly "fix" these meaning-changing violations), but beware if you do use aggressive you may have to debug... (e.g. in numpy/pandas True == np.bool_(True) but not True is np.bool_(True)!)
You can check how many violations of each type (before and after):
pep8 --quiet --statistics .
Note: I consider E501s (line too long) are a special case as there will probably be a lot of these in your code and sometimes these are not corrected by autopep8.
As an example, I applied this technique to the pandas code base.
Answer from Andy Hayden on Stack OverflowVideos
Hello everyone!
I'm interested in formatting my code so that it matches PEP 8 guidelines. I've read through PEP 8, but as you can imagine, referencing the documentation and checking my code for format is pretty time consuming.
I know that it is possible to install extensions that do this automatically in VSCode, but in order to learn best practices, I actually want to make the code changes myself.
I did some searching through the VSCode docs, but I wasn't able to find quite what I was looking for. Here's what I want:
-
A formatter which runs every time the file is saved
-
I do not want it to make any changes automatically
-
I want all the non-compliant code to be listed somewhere like the "Problems" tab in the terminal window.
-
If it adds non-intrusive squiggles in my code that's a plus (especially if I can toggle to hide it)
-
Ideally verbose enough that I know what the issue is
-
If there is links to the relevant PEP 8 guideline in the output that would be great as well.
Does anything like this exist? I'm sure the popular tools already do what I'm looking for, but I wasn't able to figure out how to configure it to the way I want. Surprisingly, there's a lot more people are looking to make the formatting less manual, not more. :)
Thank you all!
You can use autopep8! Whilst you make yourself a cup of coffee this tool happily removes all those pesky PEP8 violations which don't change the meaning of the code.
Install it via pip:
pip install autopep8
Apply this to a specific file:
autopep8 py_file --in-place
or to your project (recursively), the verbose option gives you some feedback of how it's going:
autopep8 project_dir --recursive --in-place --pep8-passes 2000 --verbose
Note: Sometimes the default of 100 passes isn't enough, I set it to 2000 as it's reasonably high and will catch all but the most troublesome files (it stops passing once it finds no resolvable pep8 infractions)...
At this point I suggest retesting and doing a commit!
If you want "full" PEP8 compliance: one tactic I've used is to run autopep8 as above, then run PEP8, which prints the remaining violations (file, line number, and what):
pep8 project_dir --ignore=E501
and manually change these individually (e.g. E712s - comparison with boolean).
Note: autopep8 offers an --aggressive argument (to ruthlessly "fix" these meaning-changing violations), but beware if you do use aggressive you may have to debug... (e.g. in numpy/pandas True == np.bool_(True) but not True is np.bool_(True)!)
You can check how many violations of each type (before and after):
pep8 --quiet --statistics .
Note: I consider E501s (line too long) are a special case as there will probably be a lot of these in your code and sometimes these are not corrected by autopep8.
As an example, I applied this technique to the pandas code base.
Unfortunately "pep8 storming" (the entire project) has several negative side-effects:
- lots of merge-conflicts
- break git blame
- make code review difficult
As an alternative (and thanks to @y-p for the idea), I wrote a small package which autopep8s only those lines which you have been working on since the last commit/branch:
Basically leaving the project a little better than you found it:
pip install pep8radius
Suppose you've done your work off of master and are ready to commit:
# be somewhere in your project directory
# see the diff with pep, see the changes you've made since master
pep8radius master --diff
# make those changes
pep8radius master --diff --in-place
Or to clean the new lines you've commited since the last commit:
pep8radius --diff
pep8radius --diff --in-place
# the lines which changed since a specific commit `git diff 98f51f`
pep8radius 98f51f --diff
Basically pep8radius is applying autopep8 to lines in the output of git/hg diff (from the last shared commit).
This script currently works with git and hg, if your using something else and want this to work please post a comment/issue/PR!