dimanche 10 mai 2015

Pylint'ing

Débutant à des normes de codage? Pylint peut être votre guide pour révéler ce qui se passe vraiment dans les coulisses et vous aider à devenir un programmeur plus conscients.
Partage de code est une entreprise enrichissante. Mettre votre code «là-bas» peut être soit un acte de philanthropie, la venue de l'âge », ou une extension de base de la croyance en open source. Quelle que soit la motivation, vos bonnes intentions peuvent ne pas avoir le résultat souhaité si les gens trouvent votre code difficile à utiliser ou à comprendre. La communauté Python a officialisé certains styles de programmation recommandées pour aider chacun à écrire du code dans une commune, convenu style qui fait le plus de sens pour le code partagé. Ce style est capturé dans PEP-8 . Pylint peut être un moyen rapide et facile de voir si votre code a capturé l'essence de PEP-8 et est donc «amical» à d'autres utilisateurs potentiels.
Peut-être que vous n'êtes pas prêt à partager votre code, mais vous souhaitez en apprendre un peu plus sur l'écriture meilleur code et ne savent pas par où commencer. Pylint peut vous dire où vous pouvez avoir exécuter égarer et vous orienter dans le sens de comprendre ce que vous avez fait et comment faire mieux.
Ce tutoriel est tout au sujet de se rapprocher des normes de codage avec peu ou aucune connaissance de programmation en profondeur ou les normes du code eux-mêmes. Il est l'équivalent de sauter le manuel et de sauter à droite dans.
Mon invite de ligne de commande pour ces exemples est:
  robertk01 bureau $

Mise en route 

Courir pylint sans arguments invoquera le dialogue de l'aide et vous donner une idée des arguments disponibles pour vous. Faites-le maintenant, à savoir:
  robertk01 bureau $ pylint
 ...
 un tas de trucs
 ...
Un couple des options que nous allons nous concentrer sur les voici:
  Master:
   --generate-rcfile = <fichier>
 Commandes:
   --help-msg = <msg-id>
 Commandes:
   --help-msg = <msg-id>
 contrôle Message:
   --disable = <msg-ids>
 Rapports:
   --files-output = <y_or_n>
   --reports = <y_or_n>
   --output-format = <format>
Faites également attention à la dernière sortie peu d'aide. Cela vous donne une idée de ce pylint va «prendre à ':
 Sortie: Utilisation de la sortie de texte par défaut, le format de message est: MESSAGE_TYPE: num_ligne: [OBJET:] MESSAGE Il ya 5 sortes de types de messages: * (C) convention, pour programmation standard violation * (R) refactor, pour mauvais code odeur * (W) avertissement, pour des problèmes spécifiques de python * (E) erreur, pour une grande partie probablement des bugs dans le code * (F) fatale, si une erreur est survenue qui a empêché pylint de faire un traitement ultérieur. 
Lorsque pylint est première manche sur un nouveau morceau de code, une plainte commune est qu'il est trop «bruyant». La configuration par défaut actuel est fixé à respecter tous les avertissements possibles. Nous allons utiliser certaines des options mentionnées ci-dessus, je pour l'adapter à vos préférences un peu mieux (et de le rendre «crier uniquement lorsque le besoin» donc).

Votre Première Pylint'ing 

Nous allons utiliser un script python base comme fourrage pour notre tutoriel. Je l'ai emprunté largement à partir du code ici:http://www.daniweb.com/code/snippet748.html Le code de départ, nous allons utiliser est appelé simplecaeser.py et est ici dans son intégralité:
  1 #! / Usr / bin / env python
  2
  3 chaîne d'importation
  4
  5 déplacement = 3
  6 = raw_input choix ("souhaitez-vous pour encoder ou décoder?")
  7 = mot (raw_input ("S'il vous plaît entrer du texte"))
  8 lettres = chaîne. Ascii_letters + string. Ponctuation + chaîne. Chiffres
  9 codé = ''
 10 si le choix == "encoder":
 11 pour la lettre dans le mot:
 12 si la lettre == '':
 13 + = codées codé ''
 14 autres:
 15 x = lettres. Index (lettre) + shift
 16 codées = + lettres codées [x]
 17 si le choix == "décoder":
 18 pour la lettre dans le mot:
 19 si la lettre == '':
 20 + = codées codé ''
 21 autres:
 22 x = lettres d'index (lettre) - décalage.
 23 codées = + lettres codées [x]
 24
 25 impression codé
Commençons.
Si nous courons ceci:
  robertk01 bureau $ pylint simplecaeser.py
 Aucun fichier de config trouvé, en utilisant la configuration par défaut
 ************* Simplecaeser Module
 C: 1, 0: module manquant docstring (missing-docstring)
 W: 3, 0: utilisations d'un module 'string' obsolète (module obsolète)
 C: 5, 0: Nom invalide "shift" constante (invalid-nom)
 C: 6, 0: nom de "choix" constante non valide (invalid-nom)
 C: 7, 0: nom invalide "mot" constante (invalid-nom)
 C: 8, 0: nom de la constante "lettres" invalides (invalid-nom)
 C: 9, 0: nom de constante valide "codé" (invalid-nom)
 C: 16,12: Opérateur non précédée d'un espace
             codées = + lettres codées [x]
                    ^ (Sans espace avant-opérateur)


 Rapport
 ======
 19 déclarations analysées.

 Répétition
 -----------

 + ------------------------- + ------ + --------- + ------ ----- +
 | | L'entreprise | précédente | différence |
 + ========================= + ====== ====== + + ========= ===== +
 | Lignes nb dupliqué | 0 | 0 | = |
 + ------------------------- + ------ + --------- + ------ ----- +
 | Cent lignes doubles | 0.000 | 0.000 | = |
 + ------------------------- + ------ + --------- + ------ ----- +



 Métriques premières
 -----------

 + ---------- + ------- + ------ + --------- + ----------- +
 | Type | nombre |% | précédente | différence |
 + + ========== ======= ====== + + + ========= =========== +
 | Code | 21 | 87.50 | 21 | = |
 + ---------- + ------- + ------ + --------- + ----------- +
 | Docstring | 0 | 0,00 | 0 | = |
 + ---------- + ------- + ------ + --------- + ----------- +
 | Commentaire | 1 | 4,17 | 1 | = |
 + ---------- + ------- + ------ + --------- + ----------- +
 | Vide | 2 | 8,33 | 2 | = |
 + ---------- + ------- + ------ + --------- + ----------- +



 Statistiques par type
 ------------------

 + --------- + ------- + ----------- + ----------- + ------- ----- + --------- +
 | Type | nombre | ancien numéro | différence | documentée% |% badname |
 + + ========= ======= + =========== =========== + + ======= ===== + + =========
 | Module | 1 | 1 | = | 0,00 | 0,00 |
 + --------- + ------- + ----------- + ----------- + ------- ----- + --------- +
 | Classe | 0 | 0 | = | 0,00 | 0,00 |
 + --------- + ------- + ----------- + ----------- + ------- ----- + --------- +
 | Méthode | 0 | 0 | = | 0,00 | 0,00 |
 + --------- + ------- + ----------- + ----------- + ------- ----- + --------- +
 | Fonction | 0 | 0 | = | 0,00 | 0,00 |
 + --------- + ------- + ----------- + ----------- + ------- ----- + --------- +



 Messages par catégorie
 --------------------

 + ----------- + ------- + --------- + ----------- +
 | Type | nombre | précédente | différence |
 + + =========== ========= ======= + + + ===========
 | Convention | 7 | 7 | = |
 + ----------- + ------- + --------- + ----------- +
 | Refactor | 0 | 0 | = |
 + ----------- + ------- + --------- + ----------- +
 | Avertissement | 1 | 1 | = |
 + ----------- + ------- + --------- + ----------- +
 | Erreur | 0 | 0 | = |
 + ----------- + ------- + --------- + ----------- +



 Messages
 --------

 + ------------------------- + ------------ +
 | ID de message | occurrences |
 + ========================= + ============ +
 | Invalid-nom | 5 |
 + ------------------------- + ------------ +
 | No-espace-avant-opérateur | 1 |
 + ------------------------- + ------------ +
 | Manquant-docstring | 1 |
 + ------------------------- + ------------ +
 | Module obsolète | 1 |
 + ------------------------- + ------------ +



 Évaluation globale
 -----------------
 Votre code a été évalué à 5,79 / 10
Wow. Cela fait beaucoup de choses. La première partie est la section 'messages' tandis que la deuxième partie est la section 'rapport'. Il ya deux points que je veux aborder ici.
Le premier point est que tous les tableaux de statistiques (à savoir le rapport) sont un peu écrasante, donc je tiens à les réduire au silence. Pour ce faire, je vais utiliser les "-Rapports = n" option.
Pointe 
 Beaucoup d'options de ligne de commande couramment utilisés de pylint ont raccourcis. par exemple, "-Rapports = n" peut être abrégé "rn".La page man de pylint répertorie tous ces raccourcis.
Deuxièmement, l'expérience précédente m'a appris que la sortie par défaut pour les messages avait besoin d'un peu plus d'infos. Nous pouvons voir la première ligne est:
  "C: 1: docstring manquant (missing-docstring)"
Cela signifie essentiellement que la ligne 1 viole une convention «C». Il me dit que je devrais vraiment avoir un docstring. Je suis d'accord, mais que faire si je ne comprends pas bien ce que je règle violée. Sachant seulement que je violé une convention est pas beaucoup d'aide si je suis un débutant.Une autre information, il est le symbole de message entre parenthèses, manquant-docstring ici.
Si je veux lire un peu plus à ce sujet, je peux revenir à la ligne de commande et essayez ceci:
  robertk01 bureau $ pylint --help-msg = manquantes docstring
 Aucun fichier de config trouvé, en utilisant la configuration par défaut
 : Manque-docstring (C0111): * docstring manquant *
   Utilisé quand un module, la fonction, la classe ou la méthode a pas docstring.  Certains spéciale
   méthodes comme __init__ ne faut pas besoin d'un docstring.  Ce message
   appartient au vérificateur de base.
Ouais, ok. Celui-là était un peu une évidence, mais je suis de fonctionner dans les messages d'erreur qui m'a laissé sans la moindre idée de ce qui a mal, tout simplement parce que je ne connaissais pas le mécanisme sous-jacent de la théorie de code. Une erreur qui perplexe mon esprit était novice:
  : trop nombreux instance-attributs (R0902): * Trop attributs d'instance (% s /% s) *
Je reçois maintenant grâce à pylint pointant vers moi. Si vous ne recevez pas de celui-là, versez une tasse de café et de regarder en elle - laissez votre esprit programmeur grandir!

La prochaine étape 

Maintenant que nous avons eu un peu de configuration des trucs sur la façon, nous allons voir ce que nous pouvons faire avec les avertissements restants.
Si nous ajoutons un docstring pour décrire ce que le code est censé faire cela peut aider. Je vais aussi être un cow-boy de bits et d'ignorer le message-module obsolète parce que je tiens à prendre des risques dans la vie. Un avertissement de dépréciation signifie que les futures versions de Python peuvent ne pas supporter ce code si mon code peut rompre à l'avenir. Il ya 5 invalide noms messages que nous allons arriver à plus tard. Enfin, je violé la Convention de l'utilisation des espaces autour d'un opérateur tel que "=" donc je vais arranger ça aussi. Pour résumer, je vais ajouter un docstring à la ligne 2, mettre des espaces autour du signe = sur la ligne 16 et utiliser le module = obsolète -disable d'ignorer l'avertissement de dépréciation.
Voici le code mis à jour:
  1 #! / Usr / bin / env python
  2 "" "Ce script invite l'utilisateur à saisir un message pour encoder ou décoder
 3 en ​​utilisant une substitution de décalage classique Caeser (3 lettre changement) "" "
  4
  5 cordes d'importation
  6
  7 shift = 3
  8 = raw_input choix ("souhaitez-vous pour encoder ou décoder?")
  9 mot = (raw_input ("S'il vous plaît entrer du texte"))
 10 lettres = chaîne. Ascii_letters + string. Ponctuation + chaîne. Chiffres
 11 codé = ''
 12 si le choix == "encoder":
 13 pour la lettre dans le mot:
 14 si la lettre == '':
 15 + = codées codé ''
 16 autres:
 17 x = lettres. Index (lettre) + shift
 18 codées = + lettres codées [x]
 19 si le choix == "décoder":
 20 pour la lettre dans le mot:
 21 si la lettre == '':
 22 + = codées codé ''
 23 autres:
 24 x = lettres d'index (lettre) - décalage.
 25 codées = + lettres codées [x]
 26
 27 impression codé
Et voici ce qui arrive quand nous courons avec notre option de -disable =-module obsolète:
  robertk01 bureau $ pylint --reports = n = --disable-module obsolète simplecaeser.py
 Aucun fichier de config trouvé, en utilisant la configuration par défaut
 ************* Simplecaeser Module
 C: 7, 0: Nom invalide "shift" constante (invalid-nom)
 C: 8, 0: nom de "choix" constante non valide (invalid-nom)
 C: 9, 0: nom invalide "mot" constante (invalid-nom)
 C: 10, 0: nom de la constante "lettres" invalides (invalid-nom)
 C: 11, 0: nom de constante valide "codé" (invalid-nom)
Nice! Nous sommes à seulement les messages non valide nom.
Il ya assez conventions bien définies autour de nommer les choses comme variables d'instance, fonctions, classes, etc. Les conventions mettent l'accent sur l'utilisation de majuscules et minuscules ainsi que les caractères qui séparent plusieurs mots dans le nom. Ceci se prête bien à la vérification via une expression régulière, donc le «devrait correspondre (([A-Z _] [A-Z1-9 _] *) |. (* __ __)) $".
Dans ce cas pylint me dit que ces variables semblent être constantes et doivent être en majuscules. Cette règle est en fait une convention de nommage qui est spécifique aux gens de Logilab qui ont créé pylint. Telle est la façon dont ils ont choisi de nommer ces variables. Vous pouvez aussi créer vos propres conventions de nommage dans la maison, mais le but de ce tutoriel, nous voulons en tenir à la norme PEP-8. Dans ce cas, les variables I déclarés doivent respecter la convention des minuscules. La règle appropriée serait quelque chose comme: "doit correspondre à [a-z _] [a-z0-9 _] {2,30} $". Notez les lettres minuscules dans l'expression régulière (az contre AZ).
Si nous lançons cette règle en utilisant un rgx -const = '[a-z _] [a-z0-9 _] {2,30} $' option, il va maintenant être assez calme:
  robertk01 bureau $ pylint --reports = n = --disable-module obsolète --const-rgx = '[a-z _] [a-z0-9 _] {2,30} $' simplecaeser.py
 Aucun fichier de config trouvé, en utilisant la configuration par défaut
Les expressions régulières peuvent être tout à fait une bête afin de prendre ma parole sur cet exemple particulier, mais aller de l'avant et de lire jusqu'àsur eux si vous voulez.
Pointe 
 Ce serait vraiment une douleur dans le cul d'avoir à utiliser toutes ces options sur la ligne de commande tout le temps. Voilà ce que le fichier rc est pour. Nous pouvons configurer notre pylint pour stocker nos possibilités pour nous afin que nous ne disposons pas de les déclarer sur la ligne de commande. En utilisant le fichier rc est une belle façon de formaliser vos règles et rapidement les partager avec les autres. Invoquant pylint --generate-rcfile créera un échantillon rcfile avec toutes les options définies et expliquées dans les commentaires.
Voilà pour l'intro de base. Plus de tutoriels suivront.




Aucun commentaire:

Enregistrer un commentaire