Dette indlæg er alene udtryk for skribentens egen holdning.

Bedre og mindre sjusket Python-kode på Linux med flymake og pep8

Af Peter Toft13. juli 2015 kl. 14:206
Artiklen er ældre end 30 dage

Jeg koder en hel del Python i hverdagen, og for at få bedre kode er kodestandarder en god investering.
Der er (som jyderne ville sige det) træls at åbne sin editor for finde kode, der ligner .
Til Python er der en glimrende kodestandard PEP8 som jeg i dette blogindlæg vil have fokus på.

På en Linux-maskine er der to hjælpepakker, som findes til de fleste Linux-varianter. Til Debian/Ubuntu installeres pep8, python-autopep8 og python-flake8 med

  1. $ sudo apt-get install python-flake8 python-autopep8 pep8

Til demo har jeg følgende lille kode-eksempel "test.py", hvor "cat -n test.py" indsætter linienumre foran hver linie

  1. $ cat -n test.py
  2. 1 #!/usr/bin/env python
  3. 2
  4. 3 import sys
  5. 4 import os
  6. 5
  7. 6 def pref(m):
  8. 7 return 2*m
  9. 8 def pref2(m):
  10. 9 return 2*m
  11. 10
  12. 11 print(pref(7))

Koden kan jeg nu checke på kommando-linien

  1. $ pep8 test.py
  2. test.py:6:1: E302 expected 2 blank lines, found 1
  3. test.py:8:1: E302 expected 2 blank lines, found 0

Dvs. der er brok over at jeg anvender inkonsistent kodestil. Ifølge PEP8 skal der være to blanke linier før hver ny funktion "pref" og "pref2".
Hvis man er lidt doven, så kan "autopep8" selv rette koden til

  1. $ autopep8 -i test.py

Det fungerer rigtig godt, men jeg har endnu større glæde af at integrere min editor Emacs med PEP8.
I min .emacs har jeg tilføjet

  1. (when (load "flymake" t)
  2. (defun flymake-pyflakes-init ()
  3. (let* ((temp-file (flymake-init-create-temp-buffer-copy
  4. 'flymake-create-temp-inplace)))
  5. (list "flake8" (list temp-file))))
  6.  
  7. ;; ... we will just redefine the list to control what will be flymaked
  8. (setq flymake-allowed-file-name-masks
  9. '(("\\.py\\'" flymake-pyflakes-init)
  10. ))
  11. )
  12.  
  13. (add-hook 'find-file-hook 'flymake-find-file-hook)
  14.  
  15. (custom-set-variables
  16. '(help-at-pt-timer-delay 0.1)
  17. '(help-at-pt-display-when-idle '(flymake-overlay)))

Hvis jeg nu åbner test.py i emacs så får jeg skæld ud on-the-fly.

Artiklen fortsætter efter annoncen

Hvis jeg sætter cursoren på en linie, der er fremhævet med rød viser nederste linie hvad der er galt. I første tilfælde at jeg importerer et library som ikke bruges.
De røde indikationer fjernes først når jeg har rettet koden op. Det giver et rigtig godt incitament til at få rettet koden op når ens editor direkte viser fejlene.

/pto

P.S. Tak til Kaare og Morten for at gøre mig meget klogere på dette :-)

6 kommentarer.  Hop til debatten
Denne artikel er gratis...

...men det er dyrt at lave god journalistik. Derfor beder vi dig overveje at tegne abonnement på Version2.

Digitaliseringen buldrer derudaf, og it-folkene tegner fremtidens Danmark. Derfor er det vigtigere end nogensinde med et kvalificeret bud på, hvordan it bedst kan være med til at udvikle det danske samfund og erhvervsliv.

Og der har aldrig været mere akut brug for en kritisk vagthund, der råber op, når der tages forkerte it-beslutninger.

Den rolle har Version2 indtaget siden 2006 - og det bliver vi ved med.

Debatten
Log ind eller opret en bruger for at deltage i debatten.
settingsDebatindstillinger
6
3. august 2015 kl. 19:56

Jeg er på ½ år blevet fan JetBrains - og især IDE'en PyCharm. Den har også PEP8 kontrol indbygget (og nem tilretning til standarden), autoindsættelse af DocStrings, Git/GitHub/Subversion/Mercurial integration og alt muligt andet. Det er naturligvis også tungere end "blot" emacs - men det er smart (IMHO)!

5
23. juli 2015 kl. 13:52

Tak for tippet Peter, jeg har tidligere manglet noget til at få pænere kode, især når jeg arbejder sammen med andre. :)

3
13. juli 2015 kl. 18:10

Der er også "vores" Vladimir Keleshev's pep257 program, programmeret mens han var på Greensteam. pip install pep257. Der er flere plugins til flake8 til dette modul.

2
13. juli 2015 kl. 17:23

Jeg bruger elpy (installeret via elpa) -- det understøtter out-of-the-box flake8 og flymake samt snippets og noget autocompletion (rope/jedi, er ikke helt inde i den del). Endelig, virtualenvs, super brugbart.

Er næsten lidt for let :-) (men, meget produktivt)

1
13. juli 2015 kl. 16:10

Til Python specifikt er der også PEP257 som kan være god at følge, det er en standard for hvordan dokumentation skal skrives. Derudover er jeg også glad for Pylint som også kan hjælpe med at skrive bedre kode.

For at sørge for at man ikke kommer til at committe kode med fejl i, kan man gøre brug af pre-commit der kan installere sig selv som et pre-commit hook i Git. Den kan så lave nogle checks på den del af koden du har rettet i og stoppe dig fra at lave et commit hvis det ikke overholder de regler man nu har sat op.