Jak naprawić wcięcie w Pythonie

264

Mam trochę kodu Python, który ma niespójne wcięcia. Istnieje wiele kombinacji zakładek i spacji, aby pogorszyć sprawę, a nawet wcięcia w przestrzeni nie są zachowywane.

Kod działa zgodnie z oczekiwaniami, ale jest trudny do utrzymania.

Jak mogę naprawić wcięcie (jak HTML Tidy , ale dla Pythona) bez łamania kodu?

Shay Erlichmen
źródło
czy możesz przejrzeć ten link i podać swoje uwagi na temat korzystania z modułu reindent.py
user1050619 26.12
Jak wspomniano poniżej przez @ andy-hayden, spójrz na to powiązane pytanie - w zasadzie autopep8zapewnia wcięcie i wiele więcej: stackoverflow.com/questions/14328406/...
Pierz
2
Jest to niezwykle przydatne pytanie, dlatego muszę to robić dość często. Tu nie chodzi o „polecanie narzędzia”, ale o „jak to zrobić”.
Andy Hayden

Odpowiedzi:

282

Użyj reindent.pyskryptu, który znajdziesz w Tools/scripts/katalogu instalacji Pythona:

Zmień pliki Python (.py), aby używały wcięć 4-spacji i nie stosowały znaków tabulacji. Przycinaj również nadmiarowe spacje i tabulatory z końców linii i usuwaj puste linie na końcu plików. Upewnij się także, że ostatnia linia kończy się nową linią.

Przejrzyj ten skrypt, aby uzyskać szczegółowe instrukcje użytkowania.

Alex Martelli
źródło
51
Niestety, nie jest to część normalnej instalacji Pythona na Debianie i Ubuntu; jest podzielony na python-examplespakiet.
ephemient
16
Doskonały! Więc wszystko, czego potrzebują użytkownicy Debiana i Ubuntu, to apt-get ten pakiet. Ewentualnie skrypt znajduje się również na stronie svn.python.org/view/python/trunk/Tools/scripts/… .
Alex Martelli,
9
@Shay Erlichmen: Spróbuj „python -tt yourscript.py”
nosklo
8
Użytkownicy Fedory / RedHat / CentOS powinni zainstalować pakiet „python-tools”.
Cristian Ciupitu
26
Aby dodać do komentarza ephemient: po python-exampleszainstalowaniu znajdziesz się w nim ponownie /usr/share/doc/pythonX.X/examples/Tools/scripts/reindent.py.
Larry Hastings
59

Jeśli używasz Vima , zobacz :h retab.

                                                        *: ret * *: retab *
: [zakres] ret [ab] [!] [new_tabstop]
                        Zamień wszystkie sekwencje białych znaków zawierające
                        <Tab> z nowymi ciągami białych znaków używając nowego
                        podana wartość tabstop. Jeśli nie określisz nowego
                        rozmiar tabstop lub jest równy zero, Vim używa bieżącej wartości
                        „tabstop”.
                        Zawsze używana jest bieżąca wartość „tabstop”
                        obliczyć szerokość istniejących kart.
                        Z! Vim zastępuje również ciągi normalne
                        spacje za pomocą tabulatorów tam, gdzie to właściwe.
                        Po włączeniu „expandtab” Vim zastępuje wszystkie zakładki znakiem
                        odpowiednia liczba spacji.
                        To polecenie ustawia „tabstop” na nową podaną wartość,
                        a jeśli jest wykonywany na całym pliku, co jest ustawieniem domyślnym,
                        nie powinien dokonywać żadnych widocznych zmian.
                        Ostrożnie: To polecenie modyfikuje dowolne znaki <Tab>
                        wewnątrz ciągów znaków w programie C. Aby uniknąć, użyj „\ t”
                        to (i tak jest to dobry nawyk).
                        „: retab!” może również zmienić sekwencję spacji o
                        <Tab> znaki, które mogą zepsuć printf ().
                        {not in Vi}
                        Niedostępne, gdy | + ex_extra | funkcja została wyłączona o godz
                        czas kompilacji.

Na przykład po prostu piszesz

:gnić

wszystkie twoje zakładki zostaną rozwinięte w spacje.

Może chcesz

: se et "skrót od: set expandtab

aby upewnić się, że żadne nowe wiersze nie będą używać literalnych tabulatorów.


Jeśli nie używasz Vima,

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

zamieni tabulatory spacjami, zakładając, że tabulatory będą zatrzymywane co 8 znaków file.py(w oryginale na file.py.bakwszelki wypadek). Zamień 8 na 4, jeśli tabulacja ma zamiast tego co 4 spacje.

efemeryczny
źródło
2
Działało dobrze. Jest to najprostszy sposób na naprawienie pomieszania wcięć tabulatorów.
Srikant
Na pewno nie najłatwiejszy sposób.
CONvid19
52

Sięgnę po autopep8, aby to zrobić:

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

Uwaga: E101 i E121 to wcięcia pep8 (myślę, że możesz po prostu przejść, --select=E1aby naprawić wszystkie problemy związane z wcięciami - te zaczynające się od E1).

Możesz zastosować to do całego projektu za pomocą flagi rekurencyjnej:

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

Zobacz także Narzędzie do konwersji kodu w języku Python, aby był zgodny z PEP8 .

Andy Hayden
źródło
to jest niesamowite ... Szukałem narzędzia takiego jak rubocop ruby ​​dla pytona
OkezieE
1
autopep8kończy się niepowodzeniem, jeśli składnia jest niepoprawna. możesz to potwierdzić za pomocąpython -tt <file.py>
Nishant
47

autopep8 -i script.py

Użyj autopep8

autopep8 automagicznie formatuje kod Pythona, aby był zgodny z PEP 8 nullstyleprzewodnikiem. Korzysta z pep8narzędzia, aby określić, które części nullcodeformatowania wymagają sformatowania. autopep8jest w stanie naprawić większość nullformattingproblemów, które mogą zostać zgłoszone przez pep8.

pip install autopep8
autopep8 script.py    # print only
autopep8 -i script.py # write file
CONvid19
źródło
mam tylko jeden kod wiersza z „import os” i 4 spacje przed nim, ale to nie wcina tego jednego… z jakiegokolwiek powodu
pkm
3
@pkm 4 miejsca (lub dowolny Wcięcia że jest wielokrotnością 4) jest częścią PEP8
rbaleksandar
13

Używając Vima, nie powinno to być bardziej angażujące niż bicie Esc, a następnie pisanie ...

:%s/\t/    /g

... na pliku, który chcesz zmienić. Spowoduje to konwersję wszystkich tabulatorów na cztery spacje. Jeśli masz również niespójne odstępy, będzie to trudniejsze.

Ben Hughes
źródło
11
czy możesz wyśledzić oryginalny koder (y) i zastosować ulepszone techniki przesłuchań? Nie ma nic gorszego niż niespójnie wcięty kod.
Ben Hughes
3
@Ben Niespójne wcięcie jest najmniejszym z naszych problemów tego faceta :)
Shay Erlichmen
9

Istnieje również PythonTidy (ponieważ powiedziałeś, że lubisz HTML Tidy).

Może jednak zrobić znacznie więcej niż tylko czyszczenie zakładek. Jeśli lubisz tego typu rzeczy, warto to sprawdzić.

Paul Hildebrandt
źródło
5

W większości systemów podobnych do UNIX możesz także uruchomić:

expand -t4 oldfilename.py > newfilename.py

z wiersza poleceń, zmieniając liczbę, jeśli chcesz zastąpić tabulatory spacjami innymi niż 4. Możesz łatwo napisać skrypt powłoki, aby zrobić to jednocześnie z wieloma plikami, zachowując oryginalne nazwy plików.

Crowman
źródło
1
Zauważ, że użycie tego samego pliku nie działa i pozostawia ci pusty plik, ale ta odpowiedź faktycznie działa i używam go, gdy muszę przekonwertować tabulatory na spacje. Czy ktoś mógłby wyjaśnić opinię negatywną? Podniosę to +1.
S. Kerdel
Czy istnieje jakiś sposób na odzyskanie zastąpionego pliku? Wystarczy stosować powyższą metodę i mój dzień warto kodu zniknął Facepalm . Dzięki
Simas
4

Jeśli jesteś leniwy (tak jak ja), możesz również pobrać wersję próbną Wingware Python IDE, która ma narzędzie do automatycznej naprawy wcięć. Działa całkiem dobrze. http://www.wingware.com/

Yansky
źródło
4

Ponowny skrypt nie działał dla mnie z powodu jakiegoś brakującego modułu. W każdym razie znalazłem to sedpolecenie, które wykonuje pracę idealną dla mnie:

sed -r 's/^([  ]*)([^ ])/\1\1\2/' file.py
Martin Vegter
źródło
2
Niedozwolone opcje -r.
HelloWorld,
2

Wypróbuj Emacsa. Ma dobre wsparcie dla wcięć potrzebnych w Pythonie. Proszę sprawdzić ten link http://python.about.com/b/2007/09/24/emacs-tips-for-python-programmers.htm

Arnkrishn
źródło
2
Tryb Python jest dobry do pisania w Pythonie, ale nic pod linkiem nie opisuje, jak naprawić wcięcie w istniejącym pliku.
ephemient
5
Mx untabify zamieni tabulatory w przestrzeń w emacsie
Paul Hildebrandt
Link jest (skutecznie) zerwany. Przekierowuje do strony o tytule „Język programowania C dla początkujących” (!).
Peter Mortensen,
1

Spróbuj IDLE i użyj Alt+, Xaby znaleźć wcięcie.

anshuman
źródło
0

Mam proste rozwiązanie tego problemu. Możesz najpierw wpisać „: retab”, a następnie „: retab!”, A następnie wszystko będzie dobrze

Hanqiang
źródło
1
Wpisz „ :retab” w jakim kontekście. W Vimie ?
Peter Mortensen,