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

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

$ 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

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

Koden kan jeg nu checke på kommando-linien

$ pep8 test.py
test.py:6:1: E302 expected 2 blank lines, found 1
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

$ 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

(when (load "flymake" t)
  (defun flymake-pyflakes-init ()
    (let* ((temp-file (flymake-init-create-temp-buffer-copy
                       'flymake-create-temp-inplace)))
      (list "flake8" (list temp-file))))
 
  ;; ... we will just redefine the list to control what will be flymaked
  (setq flymake-allowed-file-name-masks
        '(("\\.py\\'" flymake-pyflakes-init)
          ))
)
 
(add-hook 'find-file-hook 'flymake-find-file-hook)
 
(custom-set-variables
     '(help-at-pt-timer-delay 0.1)
     '(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.

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 :-)

Kommentarer (6)
Jeppe Toustrup

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.

Vijay Prasad

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)

Martin Storgaard Dieu

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)!

Log ind eller Opret konto for at kommentere