Conforme à la norme de codage Python PEP8

Dans cette série Qiita, Python a été utilisé comme langage principal pour l'analyse des données. Au fait, connaissez-vous le standard de codage Python PEP8?

Guide de style de code source PEP8

Le code source a généralement un "temps de lecture" plus long que le "temps d'écriture", et sur la base de ce fait, il a été créé sur la base de l'idée "écrivons du code facile à lire avec un style unifié". Est ce guide.

Style Guide for Python Code http://legacy.python.org/dev/peps/pep-0008/

Le chef de famille est bien sûr anglais, mais des bénévoles l'ont traduit en japonais.

Traduction japonaise PEP8 https://github.com/mumumu/pep8-ja

Dans tous les cas, je pense que ceux qui utilisent Python devraient absolument le lire.

Vérifier automatiquement le code source

Au fait, c'est beaucoup de travail de frapper un long guide dans votre tête et de le vérifier sans omission. En tant qu'être humain, vous pouvez faire des erreurs. Par conséquent, il est utile de disposer d'un outil pour vérifier si les directives sont respectées.

Dans le monde de Python, il existe une commande portant le même nom que la directive pep8. Vous pouvez vérifier en utilisant ceci.

Utiliser l'outil de vérification PEP8

Tout d'abord, installez-le avec pip comme suit.

Pour le moment, il est pratique d'inclure également pyflakes. Qu'est-ce que pyflakes? C'est un outil qui vérifie la grammaire de Python. Non seulement cela détecte les erreurs grammaticales évidentes, mais il détecte également le code inutile tel que les instructions d'importation indésirables. Présentons-le ensemble.

pip install pep8
pip install pyflakes

Django Pour ceux qui créent des applications Web avec le framework, [Introduisez flake8 comme alternative à pyflakes](http://naoina.plog.la/2013/05 / 09233720000000) et le bonheur sera réalisé.

Effectuer des vérifications de grammaire Python ensemble

Après avoir installé pep8 et pyflakes, créez un script shell comme suit et placez-le dans un répertoire de votre chemin. Au fait, j'utilise ceci comme une commande appelée pyck.

setup_environment() {
    #Spécifiez le chemin d'installation de Python
    PYTHON_PATH=/opt/python/current
    IGNORE_ERRORS=E221,E701,E202
}

main() {
    setup_environment
    which $PYTHON_PATH/bin/pyflakes > /dev/null || exit 254
    which $PYTHON_PATH/bin/pep8 > /dev/null || exit 254
    $PYTHON_PATH/bin/pyflakes $*
    $PYTHON_PATH/bin/pep8 --ignore=$IGNORE_ERRORS --repeat $*
    exit 0
}

main $*

Si vous faites pyck your_file.py pour le fichier que vous voulez vérifier, la vérification grammaticale et la vérification de conformité à la directive seront effectuées. Si rien n'est sorti, il n'y a pas d'erreur. Dans le script ci-dessus, si pep8 ou pyflakes lui-même n'existe pas, il se termine par une valeur de retour de 254.

De plus, essayer de s'adapter parfaitement aux directives peut être un problème pour certains projets. Dans de tels cas, vous pouvez spécifier le numéro de référence que vous souhaitez ignorer avec l'option pep8 --ignore comme indiqué ci-dessus.

Veuillez vous référer à la documentation PEP8 pour quel numéro d'erreur correspond à quelle syntaxe.

Vérifiez en fait le code source

Vérifions la syntaxe à titre d'exemple. Cette fois, j'ai préparé les fichiers suivants comme exemple.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys, os

def list_files(path):
    for root, dirs, files in os.walk(path):
        for filename in files:
            fullname = os.path.join(root, filename)
            print( fullname )

def main(args):
    path = args[1]
    list_files(path)

if __name__ == '__main__':
    if len(sys.argv) > 1:
        main(sys.argv)

Ce fichier os_walk.py est un programme simple qui répertorie la liste des fichiers dans le répertoire spécifié dans l'argument et la renvoie à l'écran.

Le programme lui-même fonctionne bien. Cependant, lorsqu'une vérification de syntaxe a été effectuée à ce sujet, la violation de directive suivante a été trouvée.

$ pyck os_walk.py 
os_walk.py:4:11: E401 multiple imports on one line
os_walk.py:6:1: E302 expected 2 blank lines, found 1
os_walk.py:10:19: E201 whitespace after '('
os_walk.py:12:1: E302 expected 2 blank lines, found 1
os_walk.py:19:1: W391 blank line at end of file

De cette façon, si vous écrivez le code source sans y penser, vous enfreindrez immédiatement les directives.

Utilisez des outils de vérification plus sophistiqués

Le message pep8 sera un peu difficile à voir jusqu'à ce que vous vous habituiez à où le réparer. Vous pouvez être encore plus satisfait de use py.test, qui affichera le message plus gentiment.

Tout d'abord, installez avec pip comme d'habitude.

pip install pep8 pytest pytest-pep8

Tout ce que vous avez à faire est de vérifier le fichier souhaité avec py.test --pep8 au lieu de la commande pep8. Vérifions os_walk.py plus tôt.

2.png

Un message plus détaillé a été affiché que le simple pep8. Dans ce cas, il est évident où se trouve le problème dans le code source et comment le résoudre.

Il existe également un outil appelé PyCharm que je n'ai pas utilisé. Vous pouvez utiliser ceci.

Modifier automatiquement le code source

Maintenant que vous pouvez vérifier la conformité avec les directives du code source avec un outil, corriger tout cela manuellement peut parfois être une tâche ardue. Par conséquent, utilisez l'outil de correction automatique. autopep8 est exactement cet outil de correction automatique. Introduisons-le immédiatement.

pip install autopep8

Utilisons l'outil comme autopep8 os_walk.py pour l'exemple de code ci-dessus. Ensuite, le code source modifié a été craché sur la sortie standard comme indiqué ci-dessous.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import os


def list_files(path):
    for root, dirs, files in os.walk(path):
        for filename in files:
            fullname = os.path.join(root, filename)
            print(fullname)


def main(args):
    path = args[1]
    list_files(path)

if __name__ == '__main__':
    if len(sys.argv) > 1:
        main(sys.argv)

Le problème semble certainement résolu. Pour l'écrire dans un fichier et le refléter, utilisez l'option -i comme autopep8 -i os_walk.py.

Si vous souhaitez modifier le code source sous le répertoire actuel en une seule fois, vous pouvez le modifier en une seule fois en procédant comme suit.

pep8 . | cut -d: -f 1 | sort | uniq | xargs autopep8 -i

De plus, comme pep8, autopep8 vous permet de spécifier le numéro d'erreur que vous souhaitez ignorer avec l'option --ignore.

Cependant, faire autopep8 -i sans réfléchir est une pratique assez rude, alors vérifiez le diff, vérifiez la grammaire avec pyflakes, ou utilisez nose. N'oubliez pas d'exécuter des tests pour garantir la qualité.

Si vous améliorez le script shell comme suit, vous pouvez spécifier l'option -i pour le corriger automatiquement avec autopep8, et sans l'option, vous pouvez simplement le cocher.

run_check() {
    $PYTHON_PATH/bin/flake8 --ignore=$IGNORE_ERRORS $*
}

autofix() {
    shift && $PYTHON_PATH/bin/autopep8 --ignore=$IGNORE_ERRORS -v -i $*
}

main() {
    setup_environment
    which $PYTHON_PATH/bin/autopep8 > /dev/null || exit 254
    which $PYTHON_PATH/bin/flake8 > /dev/null || exit 254
    test "$1" = "-i" || run_check $*
    test "$1" = "-i" && autofix $*
}

main $*

Vérifier auprès de l'éditeur

Au fait, si cela se produit, vous voudrez vérifier la syntaxe des Emacs que vous utilisez normalement. Dans un tel cas, nous recommandons Emacs Lisp appelé python-pep8.el.

python-pep8.el https://gist.github.com/ieure/302847

Lorsque vous l'utilisez réellement, spécifiez le chemin de pep8. Réécrivez le chemin comme suit:

;; /opt/python/Si current est le chemin d'installation de Python
(defcustom python-pep8-command "/opt/python/current/bin/pep8"
  "PEP8 command."
  :type '(file)
  :group 'python-pep8)

Tout ce que vous avez à faire maintenant est de charger python-pep8.el dans un répertoire qui se trouve dans le chemin de chargement d'Emacs. Le Lisp Emacs suivant charge python-pep8 et affecte C-c p comme liaison de clé pour la vérification de la syntaxe.

(when (load "python-pep8")
  (define-key global-map "\C-c\ p" 'python-pep8))

Vous pouvez maintenant ouvrir le code Python dans Emacs et C-c p pour vérifier la syntaxe avec pep8.

3.png

Vous pouvez désormais vérifier et modifier la syntaxe de manière transparente.

Notez que C-c p fonctionnera lors de l'édition de n'importe quel fichier tel quel, il est donc préférable d'utiliser le hook du mode python.

(load "python-pep8")
(setq python-mode-hook
  (function (lambda ()
    (local-set-key "\C-c\ p" 'python-pep8))))
    (setq auto-mode-alist (cons '("\\.py$" . python-mode) auto-mode-alist))
    (setq interpreter-mode-alist (cons '("python" . python-mode)
                                       interpreter-mode-alist)))

Emacs vous permet également d'effectuer en permanence un contrôle de conformité PEP8 et de le visualiser lors de l'édition du code source. Ceci est résumé dans un article séparé, donc voyez si vous utilisez Emacs.

Résumé

PEP8 est un guide de style de code source incontournable pour tous les programmeurs Python. Tirez pleinement parti des outils et écrivez votre code afin qu'il soit conforme autant que possible aux directives.

Recommended Posts

Conforme à la norme de codage Python PEP8
Construire un environnement conforme à la norme de codage Python (PEP8) avec Eclipse + PyDev
Résumons le standard de codage Python PEP8 (1)
Résumons le standard de codage Python PEP8 (2)
[Norme de codage Python] PEP 8 vs Google Style
Représentation matricielle avec entrée standard Python
RPC complété avec des modules Python 3 standard
python> guide de codage> PEP 0008 --Style Guide for Python Code
UnicodeEncodeError lutte avec la sortie standard de python3
Statistiques avec python
Avec PEP8 et PEP257, un codage Python qui n'est pas gênant à montrer aux gens!
Python avec Go
[Python] Entrée standard
Twilio avec Python
Intégrer avec Python
Jouez avec 2016-Python
AES256 avec python
Testé avec Python
python commence par ()
avec syntaxe (Python)
Premier Python ~ Codage 2 ~
Bingo avec python
Zundokokiyoshi avec python
Conforme à pep8
Excel avec Python
Micro-ordinateur avec Python
Cast avec python
Lire les fichiers wav avec uniquement le package standard Python
Zip, décompressez avec python
Django 1.11 a démarré avec Python3.6
Jugement des nombres premiers avec Python
Python avec eclipse + PyDev.
Grattage en Python (préparation)
Essayez de gratter avec Python.
Apprendre Python avec ChemTHEATER 03
Recherche séquentielle avec Python
"Orienté objet" appris avec python
Exécutez Python avec VBA
Manipuler yaml avec python
Communication série avec python
Apprendre Python avec ChemTHEATER 05-1
Apprenez Python avec ChemTHEATER
Exécutez prepDE.py avec python3
1.1 Premiers pas avec Python
Collecter des tweets avec Python
Binarisation avec OpenCV / Python
3. 3. Programmation IA avec Python
Méthode Kernel avec Python
Non bloquant avec Python + uWSGI
Grattage avec Python + PhantomJS
Publier des tweets avec python
Conduisez WebDriver avec python
Utiliser mecab avec Python 3
[Python] Redirection avec CGIHTTPServer
Analyse vocale par python
Obtenez une sortie standard en temps réel avec le sous-processus Python
Pensez à yaml avec python
Utiliser Kinesis avec Python
Premiers pas avec Python
Utiliser DynamoDB avec Python
Getter Zundko avec python