Outil pour convertir le code Python pour qu'il soit conforme PEP8

113

Je sais qu'il existe des outils qui valident si votre code Python est conforme à PEP8, par exemple, il existe à la fois un service en ligne et un module python .

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

Chen Xie
la source
1
Je ne pense pas qu'il existe un outil qui convertisse le code en code compatible PEP8. PEP8 incluait également des règles de dénomination des variables, donc, si un tel outil existe, il renommera également vos noms de variables et vous ne pourrez peut-être pas alors comprendre votre propre code.
Ashwini Chaudhary
1
@AshwiniChaudhary C'est un bon point, il vaut également la peine de mentionner que changer les noms de variables peut affecter d'autres personnes utilisant déjà votre code, ce n'est donc pas toujours une bonne idée. (autopep8 ne fait pas cela.)
Andy Hayden

Réponses:

38

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

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

Comme alternative (et merci à @yp pour l'idée ), j'ai écrit un petit paquet qui autopep8s uniquement les lignes sur lesquelles vous travaillez depuis le dernier commit / branch:

Fondamentalement, laisser le projet un peu mieux que vous ne l'avez trouvé :

pip install pep8radius

Supposons que vous ayez terminé votre travail masteret que vous soyez 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, pep8radiusapplique autopep8 aux lignes dans la sortie de git / hg diff (à partir du dernier commit partagé ).

Ce script fonctionne actuellement avec git et hg, si vous utilisez autre chose et que vous voulez que cela fonctionne, veuillez poster un commentaire / un problème / PR !

Andy Hayden
la source
2
+1 très bonne initiative ... je réfléchis à comment faire un plugin Notepad ++ dans le même but ... car c'est mon éditeur préféré sur Windows
kmonsoor
1
@kmonsoor bonne idée, je n'avais pas pensé aux plugins d'éditeur! Faites-moi savoir sur github de toute façon que je peux aider / rendre plus facile à utiliser en dehors de CLI ... Je prévois quelques problèmes (résolubles).
Andy Hayden
ici j'ai trouvé une liste intéressante de plugins d'éditeur github.com/jcrocholl/pep8/wiki/RelatedTools , mais pas de chance pour Notepad ++ ...
kmonsoor
1
Je viens de créer un script pour faire le pont entre Notepad ++ et Autopep8, en me basant sur un autre plugin "Python Script". Cependant, cela fonctionne. Veuillez vérifier ici: bit.ly/pep8_tonizer
kmonsoor
185

Vous pouvez utiliser autopep8 ! Pendant que vous vous préparez une tasse de café, cet outil supprime joyeusement toutes ces violations PEP8 embêtantes qui ne changent pas la signification 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 verbeuse vous donne quelques commentaires sur la façon dont ça se passe :

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

Remarque: Parfois, la valeur par défaut de 100 passes n'est pas suffisante, je la règle sur 2000 car elle est raisonnablement élevée et attrapera tous les fichiers sauf les plus gênants (elle cesse de passer une fois qu'elle ne trouve aucune infraction pep8 résoluble) ...

À ce stade, je suggère de retester et de faire un commit!

Si vous voulez une conformité PEP8 "complète" : une tactique que j'ai utilisée est d'exécuter autopep8 comme ci-dessus, puis exécutez PEP8, qui imprime les violations restantes (fichier, numéro de ligne, et quoi):

pep8 project_dir --ignore=E501

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

Remarque: autopep8 propose un --aggressiveargument (pour "corriger" impitoyablement ces violations qui changent de sens), 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 (ligne trop longue) sont un cas spécial car il y en aura probablement beaucoup dans votre code et parfois ils ne sont pas corrigés par autopep8.

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

Andy Hayden
la source
@hayden Avez-vous des commentaires sur sa fiabilité et le rapport entre les correctifs automagiques et les problèmes étranges qu'il introduit?
Marius
@Marius J'ai utilisé ceci sur le code pandas (qui est assez gros) et cela n'a montré aucun problème étrange, cela ne changera pas le code qui change la signification , j'ai mis à jour ma réponse pour les mentionner. Il avait auparavant un problème avec le hashbang de Sphinx (un bogue dans PEP8 maintenant corrigé).
Andy Hayden
2
Est-ce que cela applique Strunk and White dans les commentaires?
Eric
1
Depuis le 25 octobre 2017, le pep8package mentionné dans cette réponse a été renommé pycodestyle: github.com/PyCQA/pycodestyle/releases/tag/1.7.1
hb20007
8

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

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

little = more[3:   5]

Le code ci-dessus reste le même après avoir pep8ifying également. Mais le code n'a pas encore l'air bien. Vous pouvez utiliser des formateurs comme yapf , qui formateront le code même si le code 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 et formatez votre code Python!

ChillarAnand
la source
2
Est-ce little = more[3: 5]un bogue dans pep8 (la bibliothèque)? yapf est définitivement le futur ici, l'algorithme derrière lui (essentiellement un chemin le plus court dans le graphique de toutes les options de formatage) est une solution très élégante, et aura probablement moins de bogues ainsi que le formatage canonique.
Andy Hayden
@AndyHayden On dirait que c'est une fonctionnalité manquante, cela ne corrige pas E225
ChillarAnand
5

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 :)

capture d'écran

mork
la source
3

J'ai fait de nombreuses recherches sur différents instruments pour python et le style de code. Il existe deux types d'instruments: les linters - analysant votre code et donnant des avertissements sur les styles de code mal utilisés et montrant des conseils sur la façon de le corriger, et les formateurs de code - lorsque vous enregistrez votre fichier, il reformate votre document en utilisant le style PEP.

Parce que le reformatage doit être plus précis - s'il remodèle quelque chose que vous ne voulez pas, il est devenu inutile - ils couvrent moins une partie de PEP, les linters en montrent beaucoup plus.

Tous ont des autorisations différentes pour la configuration - par exemple, pylinter configurable dans toutes ses règles (vous pouvez activer / désactiver tous les types d'avertissements), noir non configurable du tout.

Voici quelques liens et tutoriels utiles:

Documentation:

Linters (par ordre de popularité):

Formateurs de code (par ordre de popularité):

Mikhail_Sam
la source
1

Il y a beaucoup de.

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 plugin Python pour Eclipse, etc.

Il existe des formateurs / linters qui peuvent cibler plusieurs langues. https://coala.io en est un bon exemple.

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

Une méthode spécifique de reformatage automatique consiste à analyser le fichier dans l'arborescence AST (sans laisser de commentaires), puis à le renvoyer au texte (ce qui signifie que rien du formatage d'origine n'est conservé). Un exemple de cela serait https://github.com/python/black .

user7610
la source