Comment corriger l'indentation Python

264

J'ai du code Python avec une indentation incohérente. Il y a beaucoup de mélange d'onglets et d'espaces pour aggraver la situation, et même l'indentation de l'espace n'est pas préservée.

Le code fonctionne comme prévu, mais il est difficile à maintenir.

Comment puis-je corriger l'indentation (comme HTML Tidy , mais pour Python) sans casser le code?

Shay Erlichmen
la source
pouvez-vous consulter ce lien et fournir vos entrées sur la façon d'utiliser le module reindent.py-- stackoverflow.com/questions/12132481/installing-reindent-python/…
user1050619
Comme mentionné ci-dessous par @ andy-hayden, regardez cette question connexe - autopep8fournit essentiellement une indentation et bien plus encore: stackoverflow.com/questions/14328406/…
Pierz
2
C'est une question incroyablement utile, je trouve que je dois le faire assez souvent. Il ne s'agit pas tant de "recommander un outil" que de "comment le faire".
Andy Hayden

Réponses:

282

Utilisez le reindent.pyscript que vous trouvez dans le Tools/scripts/répertoire de votre installation Python:

Modifiez les fichiers Python (.py) pour utiliser des retraits à 4 espaces et aucun caractère de tabulation fixe. Coupez également les espaces et les tabulations en excès à la fin des lignes et supprimez les lignes vides à la fin des fichiers. Assurez-vous également que la dernière ligne se termine par une nouvelle ligne.

Jetez un œil à ce script pour obtenir des instructions d'utilisation détaillées.

Alex Martelli
la source
51
Malheureusement, cela ne fait pas partie de l'installation Python normale sur Debian et Ubuntu; il est divisé en python-examplespaquet.
éphémère
16
Excellent! Donc, tout ce que les utilisateurs de Debian et Ubuntu ont besoin de faire est d'obtenir ce paquet. Alternativement, le script se trouve également sur svn.python.org/view/python/trunk/Tools/scripts/… .
Alex Martelli
9
@Shay Erlichmen: Essayez "python -tt yourscript.py"
nosklo
8
Les utilisateurs de Fedora / RedHat / CentOS doivent installer le package "python-tools".
Cristian Ciupitu
26
Juste pour ajouter au commentaire de l'éphémient: une fois python-examplesinstallé, vous trouverez une réindentation dans /usr/share/doc/pythonX.X/examples/Tools/scripts/reindent.py.
Larry Hastings
59

Si vous utilisez Vim , voir :h retab.

                                                        *: ret * *: retab *
: [range] ret [ab] [!] [new_tabstop]
                        Remplacer toutes les séquences d'espaces blancs contenant un
                        <Tab> avec de nouvelles chaînes d'espace blanc en utilisant le nouveau
                        valeur tabstop donnée. Si vous ne spécifiez pas de nouveau
                        taille tabstop ou elle est nulle, Vim utilise la valeur actuelle
                        de «tabstop».
                        La valeur actuelle de 'tabstop' est toujours utilisée pour
                        calculer la largeur des onglets existants.
                        Avec!, Vim remplace également les chaînes uniquement normales
                        espaces avec des tabulations le cas échéant.
                        Avec 'expandtab' activé, Vim remplace tous les onglets par le
                        nombre approprié d'espaces.
                        Cette commande définit 'tabstop' sur la nouvelle valeur donnée,
                        et si elle est effectuée sur l'ensemble du fichier, ce qui est par défaut,
                        ne devrait apporter aucun changement visible.
                        Attention: cette commande modifie tous les caractères <Tab>
                        à l'intérieur des chaînes dans un programme C. Utilisez "\ t" pour éviter
                        ceci (c'est une bonne habitude de toute façon).
                        ": retab!" peut également modifier une séquence d'espaces en
                        <Tab> caractères, qui peuvent gâcher un printf ().
                        {pas à Vi}
                        Non disponible lorsque | + ex_extra | fonctionnalité a été désactivée à
                        compiler le temps.

Par exemple, si vous tapez simplement

: ret

tous vos onglets seront développés en espaces.

Vous voudrez peut-être

: se et "raccourci pour: set expandtab

pour vous assurer qu'aucune nouvelle ligne n'utilisera de tabulations littérales.


Si vous n'utilisez pas Vim,

perl -i.bak -pe "s / \ t / '' x (8-pos ()% 8) / par exemple" file.py

remplacera les tabulations par des espaces, en supposant que les tabulations s'arrêtent tous les 8 caractères, dans file.py(avec l'original dans file.py.bak, juste au cas où). Remplacez les 8 par 4 si vos taquets de tabulation sont tous les 4 espaces à la place.

éphémère
la source
2
A bien fonctionné. C'est le moyen le plus simple de corriger le mélange d'indentation des onglets.
Srikant
Ce n'est certainement pas le moyen le plus simple.
CONvid19
52

Je parviendrais pour autopep8 faire ceci:

$ # see what changes it would make
$ autopep8 path/to/file.py --select=E101,E121 --diff

$ # make these changes
$ autopep8 path/to/file.py --select=E101,E121 --in-place

Remarque: E101 et E121 sont une indentation pep8 (je pense que vous pouvez simplement passer --select=E1pour résoudre tous les problèmes liés à l'indentation - ceux commençant par E1).

Vous pouvez l'appliquer à l'ensemble de votre projet à l'aide d'un indicateur récursif:

$ autopep8 package_dir --recursive --select=E101,E121 --in-place

Voir aussi Outil pour convertir le code Python en conformité avec PEP8 .

Andy Hayden
la source
c'est génial ... Je cherchais un outil comme rubocop ruby ​​pour python
OkezieE
1
autopep8échoue si la syntaxe est incorrecte. vous pouvez confirmer qu'en utilisantpython -tt <file.py>
Nishant
47

autopep8 -i script.py

Utiliser autopep8

autopep8 formate automatiquement le code Python pour se conformer au PEP 8 nullstyleguide. Il utilise l' pep8utilitaire pour déterminer quelles parties des nullcodebesoins doivent être formatées. autopep8est capable de résoudre la plupart des nullformattingproblèmes pouvant être signalés par pep8.

pip install autopep8
autopep8 script.py    # print only
autopep8 -i script.py # write file
CONvid19
la source
j'ai juste un code de ligne avec "import os" et 4 espaces avant mais ce n'est pas en retrait celui-là .... quelle que soit la raison
pkm
3
@pkm 4 espaces (ou toute indentation multiple de 4) fait partie du PEP8
rbaleksandar
13

En utilisant Vim, cela ne devrait pas être plus compliqué que de frapper Esc, puis de taper ...

:%s/\t/    /g

... sur le fichier que vous souhaitez modifier. Cela convertira tous les onglets en quatre espaces. Si vous avez également un espacement irrégulier, ce sera plus difficile.

Ben Hughes
la source
11
pouvez-vous retrouver le (s) codeur (s) d'origine et appliquer des techniques d'interrogation améliorées? Il n'y a rien de pire qu'un code indenté de manière incohérente.
Ben Hughes
3
@Ben L'indentation incohérente est le moindre de nos problèmes de ce type :)
Shay Erlichmen
9

Il y a aussi PythonTidy (puisque vous avez dit que vous aimez HTML Tidy).

Il peut faire bien plus que simplement nettoyer les onglets. Si vous aimez ce genre de chose, ça vaut le coup d'oeil.

Paul Hildebrandt
la source
5

Sur la plupart des systèmes de type UNIX, vous pouvez également exécuter:

expand -t4 oldfilename.py > newfilename.py

à partir de la ligne de commande, en changeant le nombre si vous souhaitez remplacer les tabulations par un nombre d'espaces autres que 4. Vous pouvez facilement écrire un script shell pour le faire avec un tas de fichiers à la fois, en conservant les noms de fichiers d'origine.

Crowman
la source
1
Notez que l'utilisation du même fichier ne fonctionne pas et vous laisse un fichier vide, mais cette réponse fonctionne réellement et je l'utilise lorsque j'ai besoin de convertir mes tabulations en espaces. Quelqu'un pourrait-il expliquer le downvote? Je vais augmenter +1.
S. Kerdel
Existe-t-il un moyen possible de récupérer le fichier écrasé? Je viens d'utiliser la méthode ci-dessus et le code de ma journée a disparu facepalm . Merci
Simas
4

Si vous êtes paresseux (comme moi), vous pouvez également télécharger une version d'essai de Wingware Python IDE, qui dispose d'un outil de correction automatique pour l'indentation foiré. Cela fonctionne plutôt bien. http://www.wingware.com/

Yansky
la source
4

Le script reindent n'a pas fonctionné pour moi, en raison d'un module manquant. Quoi qu'il en soit, j'ai trouvé cette sedcommande qui fait le travail parfait pour moi:

sed -r 's/^([  ]*)([^ ])/\1\1\2/' file.py
Martin Vegter
la source
2
Options illégales -r.
HelloWorld
2

Essayez Emacs. Il a un bon support pour l'indentation nécessaire en Python. Veuillez vérifier ce lien http://python.about.com/b/2007/09/24/emacs-tips-for-python-programmers.htm

Arnkrishn
la source
2
le mode python est agréable pour écrire en Python, mais rien sur le lien ne décrit comment corriger l' indentation dans un fichier existant.
éphémère
5
Mx untabify transformera les onglets en espace dans emacs
Paul Hildebrandt
Le lien est (effectivement) rompu. Il redirige vers une page intitulée "C Programming Language for Beginners" (!).
Peter Mortensen
1

Essayez IDLE et utilisez Alt+ Xpour trouver l'indentation.

anshuman
la source
0

J'ai une solution simple à ce problème. Vous pouvez d'abord taper ": retab" puis ": retab!", Alors tout irait bien

hanqiang
la source
1
Tapez " :retab" dans quel contexte. À Vim ?
Peter Mortensen