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?
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.
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.
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 .
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
:%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.
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.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/
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.
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