pylint

Pylint är ett verktyg för att utföra statiska tester av python-kod. Statiska tester innebär att koden läses igenom manuellt och kontrolleras mot en standard. I grund-konfigurationen testas koden mot PEP8 men regler kan läggas till och tas bort som det passar.

Jag testade pylint på mitt parallax-projekt och efter första körningen fick jag massor av varningar, brott mot standarden samt ett regelrätt fel:

Messages by category
--------------------

+-----------+-------+---------+-----------+
|type       |number |previous |difference |
+===========+=======+=========+===========+
|convention |21     |21       |=          |
+-----------+-------+---------+-----------+
|refactor   |1      |1        |=          |
+-----------+-------+---------+-----------+
|warning    |293    |293      |=          |
+-----------+-------+---------+-----------+
|error      |1      |1        |=          |
+-----------+-------+---------+-----------+

Detta ledde till en slutpoäng på -81.43/10, uppenbarligen har jag lite att göra ifall standarden ska uppfyllas.

En av de enkla varningarna var

W: 49: Found indentation with tabs instead of spaces

men detta löses rätt snabbt genom en snabb sök-och-ersätt.

Något som såg besvärligt ut var den långa raddan varningar om icke-använda importerade objekt

[...]
W: 22: Unused import K_HOME from wildcard import
W: 22: Unused import GL_ACCUM_RED_SIZE from wildcard import
W: 22: Unused import BLEND_RGB_MIN from wildcard import
W: 22: Unused import K_RIGHT from wildcard import
W: 22: Unused import GL_RED_SIZE from wildcard import
W: 22: Unused import HAT_RIGHT from wildcard import
W: 22: Unused import color from wildcard import
W: 22: Unused import K_GREATER from wildcard import
[...]

dessa orsakades av den generösa importeringen av bra att ha definitioner

from pygame.locals import *

Lyckligtvis var lösningen enkel eftersom ingen av dessa definitioner användes så raden togs prompt bort.

Ett regelrätt fel hade också smugit sig in

E: 47:parallaxSurface.addLevel: Undefined variable 'message'

message returnerades i en exception handler

     try:
            image = (pygame.image.load(imagePath))
        except:
            printf "couldn't open image:", imagePath
            raise SystemExit, message

Problemet löses snabbt genom att ändra printf-raden till

            message = "couldn't open image: " + imagePath
            printf message

Meddelanden märkta C indikerar brott mot standarden. T.ex

C: 55: Line too long (81/80)

Detta är ett klassiskt meddelande som härstammar från tidernas begynnelse när terminalerna endast var 80 tecken breda och för att koden skall läsas lätt på samtliga plattformar skall denna längd inte överskridas.

När ovanstående problem lösts landade slutbetyget på 3.24/10!

Utöver ett par enkla varningar återstod ett par besvärliga feltyper:

C: 23:parallaxSubSurface: Missing docstring

R: 23:parallaxSubSurface: Too few public methods (0/2)

C: 35:parallaxSurface.__init__: Invalid name "parallaxLevels" (should match [a-z_][a-z0-9_]{2,30}$)

De första två rör klassen parallaxSubsurface och den saknade dokumentations-strängen* är lätt ordnad men Too few public methods meddelandet säger egentligen att mitt sätt att använda en klass för att organisera information är fel och jag måste nog fundera ett tag innan jag gör något.

Det sista meddelandet säger att mina variabelnamn strider mot standarden. Jag är väldigt förtjust i camelCase, men för lite extra poäng gör jag mycket!

Resultatet av övningen kan ses i denna commit. Skillnaden är inte särskilt stor men läsbarheten är en aning bättre samtidigt som ett regelrätt fel har lösts. Det slutgiltiga resultatet jag uppnådde var 9.68, det återstående felet är refaktoreringsförslaget pga. att min hjälpklass saknar metoder. Denna ska jag fundera på och se ifall jag kan göra samma sak på ett annat sätt som är lika tydligt. Jag måste säga att jag blev positivt överraskad av det här verktyget och kommer fortsätta använda det i mina python-projekt.

* docstring är en del av pythons inbyggda dokumentationssystem. Dokumentation av en klass läggs in som en sträng först i klassen (precis efter den deklarerats). Samma sak gäller för moduler och funktioner.

Etiketter: , ,

Kommentera

Fyll i dina uppgifter nedan eller klicka på en ikon för att logga in:

WordPress.com Logo

Du kommenterar med ditt WordPress.com-konto. Logga ut / Ändra )

Twitter-bild

Du kommenterar med ditt Twitter-konto. Logga ut / Ändra )

Facebook-foto

Du kommenterar med ditt Facebook-konto. Logga ut / Ändra )

Google+ photo

Du kommenterar med ditt Google+-konto. Logga ut / Ändra )

Ansluter till %s


%d bloggare gillar detta: