Como corrigir o recuo do Python

264

Eu tenho algum código Python que tem recuo inconsistente. Há muita mistura de abas e espaços para piorar a situação, e nem o recuo do espaço é preservado.

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

Como posso corrigir o recuo (como HTML Tidy , mas para Python) sem quebrar o código?

Shay Erlichmen
fonte
você pode revisar este link e fornecer suas entradas sobre como usar o módulo reindent.py
user1050619
Como mencionado abaixo por @ olhar andy-Hayden nesta questão relacionada - basicamente autopep8fornece recuo e muito mais: stackoverflow.com/questions/14328406/...
Pierz
2
Esta é uma pergunta insanamente útil, acho que preciso fazer isso com bastante frequência. Não se trata de "recomendar uma ferramenta", mas de "como fazer".
Andy Hayden

Respostas:

282

Use o reindent.pyscript que você encontra no Tools/scripts/diretório da sua instalação do Python:

Altere os arquivos Python (.py) para usar recuos de 4 espaços e sem caracteres de tabulação rígidos. Também apare o excesso de espaços e guias das extremidades das linhas e remova as linhas vazias no final dos arquivos. Verifique também se a última linha termina com uma nova linha.

Dê uma olhada nesse script para obter instruções detalhadas de uso.

Alex Martelli
fonte
51
Infelizmente, não faz parte da instalação normal do Python no Debian e Ubuntu; está dividido no python-examplespacote.
ephemient 21/06/09
16
Excelente! Então, tudo o que os usuários do Debian e Ubuntu precisam fazer é obter esse pacote. Como alternativa, o script também está em svn.python.org/view/python/trunk/Tools/scripts/… .
Alex Martelli
9
@ Shay Erlichmen: Tente "python -tt YOURScript.py"
nosklo
8
Usuários do Fedora / RedHat / CentOS devem instalar o pacote "python-tools".
Cristian Ciupitu
26
Apenas para adicionar ao comentário do efêmero: uma vez python-examplesinstalado, você encontrará reindent em /usr/share/doc/pythonX.X/examples/Tools/scripts/reindent.py.
Larry Hastings
59

Se você estiver usando o Vim , consulte :h retab.

                                                        *: ret * *: retab *
: [range] ret [ab] [!] [new_tabstop]
                        Substitua todas as seqüências de espaço em branco que contêm um
                        <Tab> com novas cadeias de espaço em branco usando o novo
                        valor tabstop fornecido. Se você não especificar um novo
                        tabstop ou é zero, o Vim usa o valor atual
                        de 'tabstop'.
                        O valor atual de 'tabstop' é sempre usado para
                        calcular a largura das guias existentes.
                        Com!, O Vim também substitui cadeias de caracteres apenas normais
                        espaços com guias, quando apropriado.
                        Com 'expandtab' ativado, o Vim substitui todas as guias pela
                        número apropriado de espaços.
                        Este comando define 'tabstop' para o novo valor fornecido,
                        e se executado em todo o arquivo, que é o padrão,
                        não deve fazer nenhuma alteração visível.
                        Cuidado: Este comando modifica qualquer caractere <Tab>
                        dentro de seqüências de caracteres em um programa C. Use "\ t" para evitar
                        isso (que é um bom hábito de qualquer maneira).
                        ": retab!" também pode alterar uma sequência de espaços
                        Caracteres <Tab>, que podem atrapalhar um printf ().
                        {não no Vi}
                        Não disponível quando | + ex_extra | o recurso foi desativado em
                        tempo de compilação.

Por exemplo, se você simplesmente digitar

: ret

todas as suas guias serão expandidas em espaços.

Você pode querer

: se et "abreviação de: set expandtab

para garantir que novas linhas não usem guias literais.


Se você não estiver usando o Vim,

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

substituirá as guias por espaços, assumindo que as tabulações sejam interrompidas a cada 8 caracteres, em file.py(com o original indo para file.py.bak, apenas no caso). Substitua os 8s por 4s se as paradas de tabulação estiverem a cada 4 espaços.

efémero
fonte
2
Funcionou bem. Essa é a maneira mais fácil de corrigir a mistura de indentação de tabulação.
precisa
Com certeza não é a maneira mais fácil.
CONvid19
52

Eu alcançaria o autopep8 para fazer isso:

$ # 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: E101 e E121 são recuos pep8 (acho que você pode simplesmente passar --select=E1para corrigir todos os problemas relacionados ao recuo - aqueles começando com E1).

Você pode aplicar isso a todo o seu projeto usando sinalizador recursivo:

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

Consulte também Ferramenta para converter código Python para ser compatível com PEP8 .

Andy Hayden
fonte
isto é incrível ... Eu estive procurando por uma ferramenta como rubocop de rubi para python
OkezieE
1
autopep8falhará se a sintaxe estiver incorreta. você pode confirmar que o usopython -tt <file.py>
Nishant
47

autopep8 -i script.py

Usar autopep8

autopep8 formata automaticamente o código Python de acordo com o PEP 8 nullstyleguia. Ele usa o pep8utilitário para determinar quais partes das nullcodenecessidades precisam ser formatadas. autopep8é capaz de corrigir a maioria dos nullformattingproblemas relatados por pep8.

pip install autopep8
autopep8 script.py    # print only
autopep8 -i script.py # write file
CONvid19
fonte
eu tenho apenas um código de linha com "import os" e 4 espaços antes dele, mas não é recuar esse .... qualquer motivo por que
pkm
3
@pkm 4 espaços (ou qualquer recuo que é um múltiplo de 4) é parte da PEP8
rbaleksandar
13

Usando o Vim, não deve estar mais envolvido do que bater Esce digitar ...

:%s/\t/    /g

... no arquivo que você deseja alterar. Isso converterá todas as guias em quatro espaços. Se você tiver espaçamento inconsistente também, será mais difícil.

Ben Hughes
fonte
11
você pode rastrear o (s) codificador (es) original (is) e aplicar técnicas avançadas de interrogação? Não há nada pior do que o código recuado inconsistentemente.
21909 Ben Hughes
3
@ Ben O recuo inconsistente é o menor dos nossos problemas de aquele cara :)
Shay Erlichmen
9

Também existe o PythonTidy (desde que você disse que gosta do HTML Tidy).

No entanto, ele pode fazer muito mais do que apenas limpar as guias. Se você gosta desse tipo de coisa, vale a pena dar uma olhada.

Paul Hildebrandt
fonte
5

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

expand -t4 oldfilename.py > newfilename.py

na linha de comando, alterando o número se desejar substituir as guias por um número de espaços diferente de 4. É possível escrever facilmente um script de shell para fazer isso com vários arquivos de uma só vez, mantendo os nomes dos arquivos originais.

Crowman
fonte
1
Observe que usar o mesmo arquivo não funciona e deixa um arquivo vazio, mas essa resposta realmente funciona e eu a uso quando preciso converter minhas guias em espaços. Alguém poderia explicar o voto negativo? Eu vou marcar +1.
S. Kerdel 18/07/2016
Existe alguma maneira possível de recuperar o arquivo substituído? Acabei de usar o método acima e o valor do código do meu dia desapareceu facepalm . Obrigado
Simas
4

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

Yansky
fonte
4

O script reindent não funcionou para mim, devido a algum módulo ausente. Enfim, encontrei este sedcomando que faz o trabalho perfeito para mim:

sed -r 's/^([  ]*)([^ ])/\1\1\2/' file.py
Martin Vegter
fonte
2
Opções ilegais -r.
HelloWorld
2

Experimente o Emacs. Ele possui um bom suporte para recuo necessário em Python. Por favor, verifique este link http://python.about.com/b/2007/09/24/emacs-tips-for-python-programmers.htm

Arnkrishn
fonte
2
O modo python é bom para escrever Python, mas nada no link descreve como corrigir o recuo em um arquivo existente.
ephemient 21/06/09
5
Mx untabify vai virar guias para o espaço em emacs
Paul Hildebrandt
O link está (efetivamente) quebrado. Ele redireciona para uma página com o título "Linguagem de programação C para iniciantes" (!).
Peter Mortensen
1

Tente IDLE e use Alt+ Xpara encontrar o recuo.

anshuman
fonte
0

Eu tenho uma solução simples para esse problema. Você pode primeiro digitar ": retab" e depois ": retab!", Então tudo ficaria bem

hanqiang
fonte
1
Digite " :retab" em que contexto. No Vim ?
Peter Mortensen