/dev/blah

things i want to remember, things i want to share

Développeur Python et adepte Linux depuis 2005, passionné par beaucoup trop de choses. Profil Github

Entries tagged “tools”

usage de pylint

written by tshirtman, on 7/4/11 3:31 AM.

Pylint

J’ai utilisé pas mal pylint ces dernières semaines, pour me rendre compte de l’état général d’USF, et j’avoue, que c’était pas trop brillant, vu qu’il m’offrait une note généreuse de 2.5/10 environ… pour mes 11000 lignes de codes, ça promettait du boulot.

Et ben oui, d’où le “ces dernières semaines” mais je suis pas mécontent du résultat, beaucoup de namespaces ont été nettoyés, des logiques ont été simplifiées un peu partout, beaucoup de choses ont été documentés, et même certains refactoring conséquents ont été entrepris, et assez bien aboutis

Comment?

Et bien en lançant

pylint usf
à la racine du projet, bien sur (vu que le plus gros de mon code est dans le module usf), voir des cibles plus précises quand on sait qu’on a beaucoup de boulot sur un endroit.

Mais… il y a un mais, en effet, on peut, et on est en droit de ne pas être d’accord avec les opinions de pylint, sur ce qui est bon ou pas, si je suis d’accord sur le fait qu’il applique la pep8 aussi fortement que possible, le voir dénigrer map/filter/reduce, sous prétexte que Guido préfère écrire

[ x for x in S if P(x) ]
plutôt que
filter(P,S)
(parait que c’est “plus simple et plus lisible”…).
ou m’engueuler par ce que mon “i” dans
for i in items:
    i.update()
est une variable d’une lettre, je ne suis pas d’accord, il y a des endroit ou ça fais sens, et même
class Entity(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
Avoir des attributs d’une longueur de 1 caractère n’est pas un crime non plus…

Heureusement, pylint est fortement configurable, et on peut fortement influencer ses messages remontés, ainsi que sa note (héhé) en lui faisant utiliser une configuration alternative… le plus simple pour cela, est de lui faire cracher sa configuration actuelle, de la sauvegarder, et de la modifier:

pylint --generate-rcfile > pylintrc
vim pylintrc # oui, bon, le meilleur éditeur que vous avez sous la main quoi ;)
Le nommer ainsi permet à pylint de le détecter automatiquement s’il est dans le dossier courant, on peut aussi le placer dans son dossier ~/ et le nommer “.pylintrc” si on veux que ce soit le fichier de configuration par défaut.

Qu’est ce que je change (moi, vous c’est vous qui voyez à l’usage ;) ?

disable=W0201
(Warning 0201) Oui, ma classe n’est pas toujours complète au sortir du __init__, c’est notamment le cas pour toutes les classes d’un module, du fait de sa construction particulière, c’est vrai que plus d’utilisation de super() pourrait sans doute éviter ça… on verra si je réactive ce message un de ces 4, dans certains cas, cependant, c’est bien agréable de profiter du dynamisme de notre langage…
include-ids=yes
Je veux voir l’identifiant des erreurs remontées, pour pouvoir les black-lister si je ne suis pas d’accord ;) ou les comprendre en cherchant sur google, si le message n’est pas assez clair (ça n’arrive pas souvent :)).
attr-rgx=[a-z_][a-z0-9_]{0,30}$

argument-rgx=[a-z_][a-z0-9_]{0,30}$

variable-rgx=[a-z_][a-z0-9_]{0,30}$
la regex qui valide les noms de variables locale, d’attribut ou d’argument passé à un callable, afin d’autoriser les noms d’une lettre, comme dit plus haut (à noter que connaître un peu les regexp, ça sert trèèèès souvent… ;))
bad-functions=apply,input,exec,eval
par ce que la prog fonctionnelle (filter/map/reduce) je ne vois pas de raisons de m’en priver…

Voilà, je change pas grand chose en fait, c’est plutôt bon signe :).

Conclusion?

ma note actuelle? ;)

[SNIP]


Report
======
3763 statements analysed.

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

+-----------+-------+---------+-----------+
|type       |number |previous |difference |
+===========+=======+=========+===========+
|convention |103    |103      |=          |
+-----------+-------+---------+-----------+
|refactor   |55     |55       |=          |
+-----------+-------+---------+-----------+
|warning    |58     |58       |=          |
+-----------+-------+---------+-----------+
|error      |6      |6        |=          |
+-----------+-------+---------+-----------+

[SNIP]


Global evaluation
-----------------
Your code has been rated at 9.35/10 (previous run: 9.35/10)

[SNIP]
Et oui, il manque encore des docstrings, notamment en entête de fichiers, mais ça progresse…

Tip me if you like this :)