Outil pour convertir le code Python pour être conforme à PEP8

je sais qu'il y a des outils qui valident si votre code Python est compatible avec PEP8, par exemple il y a à la fois un service en ligne et un module python .

cependant, je ne peux pas trouver un service ou un module qui puisse convertir mon fichier Python en un fichier Python autonome, PEP8 valide. Personne ne sait si il y a lieu?

je suppose que c'est faisable puisque PEP8 est tout à propos de l'apparence du code, non?

82
demandé sur Ioannis Filippidis 2013-01-15 03:01:31

5 réponses

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

  • beaucoup de fusionner des-conflits
  • pause git blame
  • rend la révision du code difficile

comme alternative (et merci à @y-p pour l'idée ), j'ai écrit un petit paquet qui ne Pilote Automatique que les lignes sur lesquelles vous avez travaillé depuis la dernière propagation / branche:

fondamentalement quitter le projet un peu mieux que vous l'avez trouvé :

pip install pep8radius

supposons que vous avez fait votre travail sur master et êtes prêt à commettre:

# 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 engagé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

essentiellement pep8radius s'applique autopep8 vers les lignes dans 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 que ce travail de s'il vous plaît poster un commentaire/question/PR !

28
répondu Andy Hayden 2017-05-23 12:25:34

vous pouvez utiliser autopep8 ! Tandis que vous vous faites une tasse de café cet outil supprime heureusement toutes ces pesantes violations PEP8 qui ne changent pas le signification du code.

installez-le via pip:

pip install autopep8

appliquer à un dossier spécifique:

autopep8 py_file --in-place

ou à votre projet (récursivement), l'option verbeuse vous donne quelques retours sur comment :

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

Note: parfois, la valeur par défaut de 100 passes n'est pas suffisante, je la mets à 2000 car elle est raisonnablement élevée et elle va attraper tous les fichiers sauf les plus difficiles (elle cesse de passer une fois qu'elle ne trouve aucune infraction pep8 résoluble)...

à ce stade, je suggère de réessayer et de faire un commit!

Si vous voulez "full", PEP8 de la conformité: une tactique J'ai utilisé est d'exécuter autopep8 comme ci-dessus, puis D'exécuter PEP8, qui imprime les violations restantes (Fichier, numéro de ligne, et quoi):

pep8 project_dir --ignore=E501

et les modifier manuellement individuellement (par exemple E712s - comparaison avec booléen).

Note: autopep8 offre un argument --aggressive (pour" corriger " impitoyablement ces violations de sens-changement de sens), mais attention si vous utilisez aggressive vous pouvez avoir à débugger... (par exemple dans numpy/pandas True == np.bool_(True) mais pas True is np.bool_(True) !)

vous pouvez vérifier combien de violations de chaque type (avant et après):

pep8 --quiet --statistics .

Note: je considère que les E501s (ligne trop longue) sont un cas particulier car il y en aura probablement beaucoup dans votre code et parfois ils ne sont pas corrigés par autopep8.

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

150
répondu Andy Hayden 2013-10-09 00:21:42

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

cependant, les deux paquets ne peuvent supprimer que les erreurs de charpie, mais ils ne peuvent pas formater le code.

little = more[3:   5]

code ci-dessus reste le même après pep8ifying aussi. Mais le code n'est pas encore bon. Vous pouvez utiliser des formatteurs comme yapf , qui formatera le code même si le code est conforme PEP8. Le code ci-dessus sera formaté en

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 billet de blog: automatiquement PEP8 & formater votre Code Python!

6
répondu ChillarAnand 2015-12-21 06:48:43

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.

vérifier l ' utilisation autopep8.py pour le formatage de code?"- >OK

maintenant le formatage du code Ctrl-SHIFT-F d'eclipse devrait formater votre code en utilisant autopep8 :)

screen shot

3
répondu mork 2015-04-05 10:24:26

il y en a beaucoup.

IDEs ont généralement une certaine capacité de formatage intégrée. IntelliJ Idea / PyCharm fait, même chose pour Python plugin pour Eclipse, et ainsi de suite.

il y a des formateurs/linteurs 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.

0
répondu user7610 2017-09-21 11:11:28