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?


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.


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.


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 .


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

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.


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.


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.


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/


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

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


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


0

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


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.