Wpisy z kategorii: pep8

Automatyczne sprawdzanie zgodności kodu Pythona z PEP8

Jakiś czas temu pisałem o skrypcie który sprawdza zgodność kodu Pythona z PEP8. Jednak podczas pracy nad kilkoma projektami zauważyłem, że nie chciało mi się za każdym razem ręcznie uruchamiać tego skryptu na całym projekcie. Sprowadzało się do tego że uruchamiałem go gdy projekt był już skończony. Prowadziło do tego że nie byłem w stanie czasowo wprowadzić wszystkich poprawek, bo było ich bardzo dużo.

Niby wydawało by się że wystarczy raz czy dwa przeczytać dokument PEP8 i przy pisaniu kodu stosować się do zaleceń, jednak potem gdy pisze się kod to się o wszystkim zapomina. Wydaje mi się że z pisaniem kodu jest jak z ładnym odręcznym pisaniem, to nawyk którego się nie da się nauczyć czytając jakieś poradniki. Tak samo jest ze stylem pisania kodu.

Skrypt do sprawdzania poprawności stylu kodu sprawdza się tutaj znakomicie, pozwala w szybki sposób na wyuczenie nawyku pisania kodu zgodnego z PEP8. Aby ułatwić sprawę, dodałem do testów danego projektu, przypadek testowy który uruchamia skrypt i sprawdza kod całego projektu. Jeżeli kod nie jest zgody z PEP8, to wyrzuca wyjątek i pokazuje dokładnie co trzeba poprawić.

from StringIO import StringIO

import sys

import unittest

import pep8


class PEP8TestCase(unittest.TestCase):

    def test_pep8_rules(self):  
        sys.argv[1:] = ['--filename=*.py', '--show-source', '--show-pep8', 
                               my_project.__path__[0]]  
        buf = StringIO()         
        sys.stdout = buf
        pep8._main()            
        sys.stdout = sys.__stdout__   
        result = buf.getvalue()

        self.assertEqual("", result,
                     "Code messages should be empty but was:\n" + result)

Wystarczy teraz na bieżąco podczas pisania kodu uruchamiać testy i mamy pewność że powstały kod jest zgodny z PEP8. Bardzo fajnie sprawdza się to także z pisaniem kodu wykorzystując Test Driven Development. Podczas pisania i uruchamiania testów od razu mamy sprawdzony cały powstały kod.

Po paru poprawkach pisanie kodu zgodnego z PEP8 wejdzie nam tak w krew że podczas pisania kodu od razu zacznie się pisać poprawny kod. Przydaje się tutaj włączenie w edytorze pokazywanie białych znaków aby od razu wykrywać miejsca gdzie znajdują się nadmiarowe białe znaki.

Zauważyłem także, że dbając o styl kodu, wykrywa się też miejsca które można zrefaktoryzować i uprościć.

Jak sprawdzać zgodność kodu Pythona z PEP8

Znalazłem ostatnio bardzo fajne narzędzie do sprawdzania czy kod Pythona jest zgodny z zalecanym stylem pisania kodu w Pythonie(PEP8). Jest to skrypt uruchamiany z konsoli który sprawdza czy wskazany moduł jest zgodny z PEP8.

Przykład użycia:

$ pep8.py --filename=*.py --show-source --show-pep8 /sciezka/do/projektu/
parts/djangopl/sitemaps.py:14:5: E301 expected 1 blank line, found 0
def changefreq(self, obj):
^
Separate top-level function and class definitions with two blank lines.

Method definitions inside a class are separated by a single blank line.

Extra blank lines may be used (sparingly) to separate groups of related
functions.  Blank lines may be omitted between a bunch of related
one-liners (e.g. a set of dummy implementations).

Use blank lines in functions, sparingly, to indicate logical sections.
...

parametry:

  • filename - wzorzec jakie pliki mają być brane pod uwagę
  • show-source - przy każdym błędzie będzie wypisany kawałek kodu i wskazane w którym miejscu jest błąd
  • show-pep8 - do każdego błędu będzie podane wyjaśnienie z dokumentu PEP8

Wynik działania prezentuje się bardzo ładnie i można szybko wychwycić gdzie jest błąd i zobaczyć dlaczego tak nie powinno się pisać kodu w Pythonie.

Znalazłem też opis jak zintegrować sprawdzanie zgodności z PEP8 z testami wykorzystywanymi w systemie typu continuous integration:

http://www.ajaxline.com/continuous-integration-in-django-project

Przydatne linki związane z PEP8: