Cara memperbaiki indentasi Python

264

Saya memiliki beberapa kode Python yang memiliki indentasi yang tidak konsisten. Ada banyak campuran tab dan spasi untuk membuat masalah lebih buruk, dan bahkan lekukan ruang tidak diawetkan.

Kode berfungsi seperti yang diharapkan, tetapi sulit untuk mempertahankannya.

Bagaimana saya bisa memperbaiki indentasi (seperti HTML Tidy , tetapi untuk Python) tanpa melanggar kode?

Shay Erlichmen
sumber
dapatkah Anda meninjau tautan ini dan memberikan masukan Anda tentang cara menggunakan modul reindent.py
user1050619
Seperti yang disebutkan di bawah oleh @ andy-hayden lihat pertanyaan terkait ini - pada dasarnya autopep8memberikan lekukan dan banyak lagi: stackoverflow.com/questions/14328406/…
Pierz
2
Ini adalah pertanyaan yang sangat berguna, saya merasa perlu melakukan ini cukup sering. Ini bukan tentang "merekomendasikan alat" sebanyak "bagaimana melakukannya".
Andy Hayden

Jawaban:

282

Gunakan reindent.pyskrip yang Anda temukan di Tools/scripts/direktori instalasi Python Anda:

Ubah file Python (.py) untuk menggunakan indentasi 4-ruang dan tidak ada karakter tab keras. Potong juga spasi dan tab berlebih dari ujung garis, dan hapus garis kosong di ujung file. Pastikan juga baris terakhir berakhir dengan baris baru.

Lihat skrip itu untuk instruksi penggunaan terperinci.

Alex Martelli
sumber
51
Sayangnya, ini bukan bagian dari instalasi Python normal pada Debian dan Ubuntu; itu dibagi ke dalam python-examplespaket.
ephemient
16
Luar biasa! Jadi semua yang perlu dilakukan pengguna Debian dan Ubuntu adalah untuk apt-get paket itu. Atau, skrip juga ada di svn.python.org/view/python/trunk/Tools/scripts/… .
Alex Martelli
9
@Shay Erlichmen: Coba "python -tt yourscript.py"
nosklo
8
Pengguna Fedora / RedHat / CentOS harus menginstal paket "python-tools".
Cristian Ciupitu
26
Hanya untuk menambahkan komentar ephemient: setelah python-examplesterinstal, Anda akan menemukan reindent di /usr/share/doc/pythonX.X/examples/Tools/scripts/reindent.py.
Larry Hastings
59

Jika Anda menggunakan Vim , lihat :h retab.

                                                        *: ret * *: retab *
: [range] ret [ab] [!] [new_tabstop]
                        Ganti semua urutan ruang putih yang mengandung a
                        <Tab> dengan string spasi putih baru menggunakan yang baru
                        nilai tabstop yang diberikan. Jika Anda tidak menentukan yang baru
                        ukuran tabstop atau nol, Vim menggunakan nilai saat ini
                        dari 'tabstop'.
                        Nilai 'tabstop' saat ini selalu digunakan
                        hitung lebar tab yang ada.
                        Dengan!, Vim juga menggantikan string yang biasa saja
                        spasi dengan tab yang sesuai.
                        Dengan 'expandtab' on, Vim mengganti semua tab dengan
                        jumlah ruang yang sesuai.
                        Perintah ini menetapkan 'tabstop' ke nilai baru yang diberikan,
                        dan jika dilakukan pada seluruh file, yang merupakan standar,
                        seharusnya tidak membuat perubahan apa pun yang terlihat.
                        Hati-hati: Perintah ini mengubah setiap karakter <Tab>
                        di dalam string dalam program C. Gunakan "\ t" untuk menghindari
                        ini (itu kebiasaan yang baik).
                        ": retab!" juga dapat mengubah urutan spasi dengan
                        <Tab> karakter, yang dapat mengacaukan printf ().
                        {tidak dalam Vi}
                        Tidak tersedia ketika | + ex_extra | fitur dinonaktifkan pada
                        waktu kompilasi.

Misalnya, jika Anda cukup mengetik

:membasahi

semua tab Anda akan diperluas menjadi spasi.

Anda mungkin mau

: se et "kependekan dari: set expandtab

untuk memastikan bahwa setiap baris baru tidak akan menggunakan tab literal.


Jika Anda tidak menggunakan Vim,

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

akan mengganti tab dengan spasi, dengan asumsi tab berhenti setiap 8 karakter, dalam file.py(dengan aslinya akan file.py.bak, untuk berjaga-jaga). Ganti 8s dengan 4s jika tab Anda berhenti setiap 4 spasi sebagai gantinya.

singkat
sumber
2
Bekerja dengan baik. Ini adalah cara termudah untuk memperbaiki campur aduk tab.
Srikant
Pastinya bukan cara termudah.
CONvid19
52

Saya akan meraih autopep8 untuk melakukan ini:

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

Catatan: E101 dan E121 adalah indentasi pep8 (saya pikir Anda bisa dengan mudah lulus--select=E1 memperbaiki semua masalah terkait indentasi - yang dimulai dengan E1).

Anda dapat menerapkan ini pada seluruh proyek Anda menggunakan tanda rekursif:

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

Lihat juga Alat untuk mengonversi kode Python menjadi sesuai dengan PEP8 .

Andy Hayden
sumber
ini luar biasa ... Saya sudah mencari alat seperti rubocop ruby ​​untuk python
OkezieE
1
autopep8gagal jika sintaksnya salah. Anda dapat mengonfirmasi bahwa menggunakanpython -tt <file.py>
Nishant
47

autopep8 -i script.py

Gunakan autopep8

autopep8 secara otomatis memformat kode Python agar sesuai dengan PEP 8 nullstylepanduan ini. Ia menggunakan pep8utilitas untuk menentukan bagian mana dari nullcodekebutuhan yang akan diformat. autopep8mampu memperbaiki sebagian besar nullformattingmasalah yang dapat dilaporkan oleh pep8.

pip install autopep8
autopep8 script.py    # print only
autopep8 -i script.py # write file
HUBUNGI19
sumber
saya hanya punya satu kode baris dengan "import os" dan 4 spasi sebelum itu tetapi tidak membuat indentasi satu itu .... ada alasan mengapa
pkm
3
@pkm 4 spasi (atau indentasi apa pun yang merupakan kelipatan dari 4) adalah bagian dari PEP8
rbaleksandar
13

Menggunakan Vim, seharusnya tidak lebih dari sekadar memukul Esc, dan kemudian mengetik ...

:%s/\t/    /g

... pada file yang ingin Anda ubah. Itu akan mengubah semua tab menjadi empat spasi. Jika Anda memiliki spasi yang tidak konsisten juga, maka itu akan lebih sulit.

Ben Hughes
sumber
11
dapatkah Anda melacak pembuat kode asli dan menerapkan teknik interogasi yang disempurnakan? Tidak ada yang lebih buruk daripada kode indentasi tidak konsisten.
Ben Hughes
3
@ Ben The konsisten lekuk adalah sedikit masalah kita dari orang yang :)
Shay Erlichmen
9

Ada juga PythonTidy (karena Anda bilang Anda suka HTML Tidy).

Itu bisa melakukan lebih banyak dari sekadar membersihkan tab. Jika Anda menyukai hal semacam itu, ada baiknya dilihat.

Paul Hildebrandt
sumber
5

Pada kebanyakan sistem mirip UNIX, Anda juga dapat menjalankan:

expand -t4 oldfilename.py > newfilename.py

dari baris perintah, ubah nomor jika Anda ingin mengganti tab dengan sejumlah spasi selain 4. Anda dapat dengan mudah menulis skrip shell untuk melakukan ini dengan banyak file sekaligus, mempertahankan nama file asli.

Crowman
sumber
1
Perhatikan bahwa menggunakan file yang sama tidak berfungsi dan meninggalkan Anda dengan file kosong, tetapi jawaban ini benar-benar berfungsi dan saya menggunakannya ketika saya perlu mengubah tab saya menjadi spasi. Adakah yang bisa menjelaskan downvote? Saya akan menaikkannya +1.
S. Kerdel
Apakah ada cara yang mungkin untuk memulihkan file yang ditimpa? Hanya menggunakan metode di atas dan nilai hari saya dari kode menghilang facepalm . Terima kasih
Simas
4

Jika Anda malas (seperti saya), Anda juga dapat mengunduh versi percobaan Wingware Python IDE, yang memiliki alat perbaikan otomatis untuk lekukan kacau. Ini bekerja dengan cukup baik. http://www.wingware.com/

Yansky
sumber
4

Skrip reindent tidak berfungsi untuk saya, karena ada beberapa modul yang hilang. Lagi pula, saya menemukan sedperintah ini yang melakukan pekerjaan sempurna bagi saya:

sed -r 's/^([  ]*)([^ ])/\1\1\2/' file.py
Martin Vegter
sumber
2
Opsi ilegal -r.
HelloWorld
2

Coba Emacs. Ini memiliki dukungan yang baik untuk lekukan yang dibutuhkan dengan Python. Silakan periksa tautan ini http://python.about.com/b/2007/09/24/emacs-tips-for-python-programmers.htm

Arnkrishn
sumber
2
mode python bagus untuk menulis Python, tetapi tidak ada di tautan yang menjelaskan cara memperbaiki lekukan dalam file yang ada.
ephemient
5
Mx untabify akan mengubah tab menjadi ruang di emacs
Paul Hildebrandt
Tautan ini (secara efektif) rusak. Ini dialihkan ke halaman dengan judul "Bahasa Pemrograman C untuk Pemula" (!).
Peter Mortensen
1

Coba IDLE , dan gunakan Alt+ Xuntuk menemukan lekukan.

tidak manusiawi
sumber
0

Saya punya solusi sederhana untuk masalah ini. Pertama-tama Anda dapat mengetik ": retab" dan kemudian ": retab!", Maka semuanya akan baik-baik saja

Hanqiang
sumber
1
Tipe ":retab " dalam konteks apa. Di Vim ?
Peter Mortensen