Como corrigir a indentação em Python

Tenho um código Python que tem indentação inconsistente. Há uma grande mistura de tabulações e espaços para tornar a matéria ainda pior, e mesmo a indentação do espaço não é preservada.

O código funciona como esperado, mas é difícil de manter.

Como posso corrigir a indentação (como HTML Tidy, mas para Python) sem quebrar o código?

 232
Author: Peter Mortensen, 2009-06-21

12 answers

Use o programa reindent.py que encontra na pasta Tools/scripts/ da sua instalação em Python:

Mudar os ficheiros Python (. py) para usar 4-espaços indenta e sem tabulação dura caracter. Também aparar os espaços em excesso e abas das extremidades das linhas, e remover as linhas vazias no final de arquivo. Também garantir o fim da última linha com uma linha nova.

Dê uma olhada nesse script para instruções de Utilização detalhadas.

 266
Author: Alex Martelli, 2009-06-21 19:29:15

Se estiver a utilizar Vim , Ver :h retab.

                                                        *:ret* *:retab*
:[range]ret[ab][!] [new_tabstop]
                        Replace all sequences of white-space containing a
                        <Tab> with new strings of white-space using the new
                        tabstop value given.  If you do not specify a new
                        tabstop size or it is zero, Vim uses the current value
                        of 'tabstop'.
                        The current value of 'tabstop' is always used to
                        compute the width of existing tabs.
                        With !, Vim also replaces strings of only normal
                        spaces with tabs where appropriate.
                        With 'expandtab' on, Vim replaces all tabs with the
                        appropriate number of spaces.
                        This command sets 'tabstop' to the new value given,
                        and if performed on the whole file, which is default,
                        should not make any visible change.
                        Careful: This command modifies any <Tab> characters
                        inside of strings in a C program.  Use "\t" to avoid
                        this (that's a good habit anyway).
                        ":retab!" may also change a sequence of spaces by
                        <Tab> characters, which can mess up a printf().
                        {not in Vi}
                        Not available when |+ex_extra| feature was disabled at
                        compile time.

Por exemplo, se simplesmente escrever

:ret

Todas as tuas abas serão expandidas para espaços.

Talvez queiras

:se et  " shorthand for :set expandtab

Para ter a certeza que as novas linhas não irão usar páginas literais.


Se não estiver a utilizar Vim,

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

Irá substituir tabs por espaços, assumindo que tab pára a cada 8 caracteres, em file.py (com o original indo para file.py.bak, só para o caso). Substituir os 8s com 4s se a sua tabulação parar são a cada 4 espaços em vez disso.

 51
Author: ephemient, 2009-06-21 18:26:29

Eu queria autopep8 para fazer isto:

$ # 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

Nota: O E101 e o E121 são indentação pep8 (penso que pode simplesmente passar {[[2] } para corrigir todos os problemas relacionados com indentação - aqueles que começam com o E1).

Pode aplicar isto a todo o seu projecto usando a opção recursiva:

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

Veja Também ferramenta para converter o código Python para compatível com o PEP8 .

 38
Author: Andy Hayden, 2017-05-23 12:10:41

Utilizar autopep8

autopep8 automaticamente Formata o código Python de acordo com o PEP 8 nullstyle guia. Ele usa o utilitário pep8 para determinar que partes do nullcode tem de ser formatado. autopep8 é capaz de fixar a maior parte da nullformatting questões que podem ser comunicadas por pep8.

pip install autopep8
autopep8 script.py    #  print only
autopep8 -i script.py # write file
 18
Author: Pedro Lobito, 2018-09-01 12:44:44
Usando a Vim, não deve estar mais envolvido do que bater em Esc e depois escrever...
:%s/\t/    /g

...no arquivo você quer mudar. Isso irá converter todas as tabulações para quatro espaços. Se você tem espaçamento inconsistente também, então isso será mais difícil.

 10
Author: Ben Hughes, 2018-08-11 23:33:50

Existe também PythonTidy (já que disseste que gostas de HTML Tidy).

Pode fazer muito mais do que limpar as páginas. Se gostas desse tipo de coisas, vale a pena dar uma vista de olhos.
 8
Author: Paul Hildebrandt, 2018-08-11 23:37:58

Se você é preguiçoso( como eu), Você também pode baixar uma versão de teste do WINGWARE Python IDE, que tem uma ferramenta de correção automática para indentação confusa. Funciona muito bem. http://www.wingware.com/

 5
Author: Yansky, 2010-08-21 22:35:51

Na maioria dos sistemas do tipo UNIX, você também pode executar:

expand -t4 oldfilename.py > newfilename.py

A partir da linha de comandos, alterando o número se quiser substituir as páginas por um número de espaços diferentes de 4. Você pode facilmente escrever um script shell para fazer isso com um monte de arquivos ao mesmo tempo, mantendo os nomes de arquivos originais.

 4
Author: Paul Griffiths, 2013-05-25 12:40:05

O script reindent não funcionou para mim, devido a algum módulo em falta. De qualquer forma, encontrei este comando que faz o trabalho perfeito para mim.

sed -r 's/^([  ]*)([^ ])/\1\1\2/' file.py
 3
Author: Martin Vegter, 2018-08-11 23:41:03
Tenta Emacs. Ele tem um bom suporte para a indentação necessária em Python. Por favor verifique esta ligação http://python.about.com/b/2007/09/24/emacs-tips-for-python-programmers.htm
 2
Author: Arnkrishn, 2018-08-11 23:35:27
Tenho uma solução simples para este problema. Você pode primeiro digitar ":retab" e depois ":retab!", então tudo estaria bem.
 0
Author: hanqiang, 2013-04-13 01:59:44

Tentar IDLE , e usar Alt + X para encontrar indentação.

 0
Author: anshuman, 2018-08-11 23:39:17