web-dev-qa-db-fra.com

Outil pour convertir le code Python en conformité avec PEP8

Je sais qu'il existe des outils permettant de vérifier si votre code Python est conforme à PEP8. Par exemple, il existe un service en ligne } et un module python .

Cependant, je ne trouve pas de service ou de module qui puisse convertir mon fichier Python en fichier Python autonome et valide pour PEP8. Est-ce que quelqu'un sait s'il y en a?
Je suppose que c’est faisable puisque PEP8 concerne l’apparence du code, non?

87
Chen Xie

Malheureusement, "pep8 storming" (l'ensemble du projet) a plusieurs effets secondaires négatifs:

  • beaucoup de conflits de fusion
  • briser le blâme
  • rendre la révision de code difficile

En guise d'alternative (et grâce à @ y-p pour l'idée ), j'ai écrit un petit paquetage qui autopep8 ne contient que les lignes sur lesquelles vous avez travaillé depuis le dernier commit/branch:

En gros, laisser le projet un peumeilleur que vous ne l'avez trouvé :

pip install pep8radius

Supposons que vous ayez effectué votre travail hors de master et que vous êtes prêt à vous engager:

# be somewhere in your project directory
# see the diff with pep, see the changes you've made since master
pep8radius master --diff
# make those changes
pep8radius master --diff --in-place

Ou pour nettoyer les nouvelles lignes que vous avez validées depuis le dernier commit:

pep8radius --diff
pep8radius --diff --in-place

# the lines which changed since a specific commit `git diff 98f51f`
pep8radius 98f51f --diff

Fondamentalement pep8radius applique autopep8 aux lignes de la sortie de git/hg diff (de le dernier commit partagé ).

Ce script fonctionne actuellement avec git et hg, si vous utilisez autre chose et voulez que cela fonctionne merci de poster un commentaire/numéro/PR !

31
Andy Hayden

Vous pouvez utiliser autopep8 ! Pendant que vous préparez vous-même une tasse de café, cet outil supprime toutes les violations embêtantes de PEP8 qui ne changent pas le sens du code.

Installez-le via pip:

pip install autopep8

Appliquez ceci à un fichier spécifique:

autopep8 py_file --in-place

ou à votre projet (récursivement), l'option verbose vous donne quelques informations sur son déroulement:

autopep8 project_dir --recursive --in-place --pep8-passes 2000 --verbose

Note: Parfois, le nombre par défaut de 100 passes ne suffit pas, je le règle sur 2000 car il est raisonnablement élevé et intercepte tous les fichiers, sauf les plus problématiques (il cesse de passer dès qu'il ne détecte plus d'infractions pep8 résolvables) ...

À ce stade, je suggère de refaire les tests et de faire un commit!

Si vous voulez "complet" conformité PEP8: une tactique que j'ai utilisée consiste à exécuter autopep8 comme ci-dessus, puis à exécuter PEP8, qui affiche les violations restantes (fichier, numéro de ligne et autres):

pep8 project_dir --ignore=E501

et modifiez-les manuellement individuellement (par exemple, E712 - comparaison avec un booléen).

Note: autopep8 propose un argument --aggressive (pour impitoyablement "corriger" ces violations de sens changeantes), mais méfiez-vous si vous utilisez agressif, vous devrez peut-être déboguer ... (par exemple, dans numpy/pandas True == np.bool_(True) mais pas True is np.bool_(True)!)

Vous pouvez vérifier le nombre de violations de chaque type (avant et après):

pep8 --quiet --statistics .

Remarque: Je considère que les E501 (lignes trop longues) constituent un cas particulier, car il y en aura probablement beaucoup dans votre code et, parfois, elles ne sont pas corrigées par autopep8.

A titre d'exemple, j'ai appliqué cette technique à la base de code pandas .

156
Andy Hayden

@Andy Hayden a donné un bon aperçu de autopep8. En plus de cela, il existe un autre paquet appelé pep8ify qui fait également la même chose.

Cependant, les deux packages ne peuvent supprimer que les erreurs de filtre mais ils ne peuvent pas formater le code.

little = more[3:   5]

Le code ci-dessus reste le même après le pep8ifying également. Mais le code n'a pas encore l'air bon. Vous pouvez utiliser des outils de formatage tels que yapf , qui formateront le code même s'il est conforme à PEP8. Le code ci-dessus sera formaté pour 

little = more[3:5]

Parfois, cela détruit même votre formatage manuel. Par exemple 

BAZ = {
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12]
}

sera converti en 

BAZ = {[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]}

Mais vous pouvez lui dire d'ignorer certaines parties.

BAZ = {
   [1, 2, 3, 4],
   [5, 6, 7, 8],
   [9, 10, 11, 12]
}  # yapf: disable

Tiré de mon ancien article de blog: Automatiquement PEP8 & Formate Your Code Python!

7
ChillarAnand

Si vous utilisez Eclipse + PyDev, vous pouvez simplement activer autopep8 à partir des paramètres de PyDev: Windows -> Préférences -> tapez "autopep8" dans le filtre de recherche.

Cochez la case "utiliser autopep8.py pour le formatage du code?" -> ok

Maintenant, le formatage du code CTRL-SHIFT-F d’Eclipse devrait formater votre code en utilisant autopep8 :)

screen shot

3
mork

Il y en a beaucoup.

Les IDE ont généralement une capacité de formatage intégrée. IntelliJ Idea/PyCharm le fait, il en va de même pour le plug-in Python pour Eclipse, etc.

Certains formateurs/linters peuvent cibler plusieurs langues. https://coala.io est un bon exemple de ceux-ci.

Ensuite, il y a les outils à usage unique, dont beaucoup sont mentionnés dans d'autres réponses.

0
user7610