Converting a Python project to PEP8 with Shell
When I started Python I didn’t learn PEP8 immediately so my code was not following the standard format. As I know Bash quite well, I’ve converted my projects later, with the following commands.
Convert tabs to 4 spaces
find . -name '*.py'|xargs pep8|grep W191|cut -d : -f1|xargs sed -i "s/\t/ /g"
Suppress spaces when they’re alone on the line
find . -name '*.py'|xargs pep8|grep W293|cut -d : -f1|sort -u|xargs sed -i "s/^ *$//"
Suppress spaces at end of line
find . -name '*.py'|xargs pep8|grep W291|cut -d : -f1|sort -u|xargs sed -i "s/ *$//"
Add spaces after “:”, “,”
find . -name '*.py'|xargs pep8|grep E231|cut -d : -f1|sort -u|xargs sed -i 's/:\([^ ]\)/: \1/g' find . -name '*.py'|xargs pep8|grep E231|cut -d : -f1|sort -u|xargs sed -i 's/,\([^ ]\)/, \1/g'
Suppress spaces before or after {} [] ()
find . -name '*.py'|xargs pep8|grep E201|cut -d : -f1|sort -u|xargs sed -i 's/{ */{/g' find . -name '*.py'|xargs pep8|grep E201|cut -d : -f1|sort -u|xargs sed -i 's/\[ */[/g' find . -name '*.py'|xargs pep8|grep E201|cut -d : -f1|sort -u|xargs sed -i 's/( */(/g' find . -name '*.py'|xargs pep8|grep E202|cut -d : -f1|sort -u|xargs sed -i 's/ *}/}/g' find . -name '*.py'|xargs pep8|grep E202|cut -d : -f1|sort -u|xargs sed -i 's/ *]/]/g' find . -name '*.py'|xargs pep8|grep E202|cut -d : -f1|sort -u|xargs sed -i 's/ *)/)/g'
Suppress spaces before “(“, “:”
find . -name '*.py'|xargs pep8|grep E211|cut -d : -f1|sort -u|xargs sed -i 's/ *(/(/g' find . -name '*.py'|xargs pep8|grep E203|cut -d : -f1|sort -u|xargs sed -i 's/ *:/:/g'
Add a blank line at end of file
find . -name '*.py'|xargs pep8|grep W292|cut -d: -f1|while read f; do echo >> $f; done
Add a blank line before “def” or “class”, to be run two times
find . -name '*.py'|xargs pep8|grep E302|cut -d : -f1|sort -u|xargs sed -i 's/^def/\ndef/' find . -name '*.py'|xargs pep8|grep E302|cut -d : -f1|sort -u|xargs sed -i 's/^class/\nclass/'
Sometimes I don’t really want to cut long lines, so I keep lines up to 120 characters
find . -name '*.py'|xargs pep8 --max-line-length=120
I think that 80 is to restrictive and based on terminals of the last century or on paper sizes that no one uses any more.
However, I’ve learned how to cut long lines with chained calls.
Before:
compte.dernier_solde = SoldeJour.objects.filter(compte_id=compte.id).order_by('-date_solde')[0].solde
After, with parenthesis to tell the Python parser that a single expression is on multiple lines:
compte.dernier_solde = ( SoldeJour .objects .filter(compte_id=compte.id) .order_by('-date_solde')[0] .solde )
I’ve also configured Scite, my favorite editor, for spaces and tabs.
use.tabs=0 tabsize=4 indent.size=4