Alat untuk mengonversi kode Python agar sesuai dengan PEP8

113

Saya tahu ada alat yang memvalidasi apakah kode Python Anda sesuai dengan PEP8, misalnya ada layanan online dan modul python .

Namun, saya tidak dapat menemukan layanan atau modul yang dapat mengonversi file Python saya menjadi file Python valid PEP8 yang mandiri. Apakah ada yang tahu jika ada?
Saya menganggap itu layak karena PEP8 adalah tentang penampilan kode, bukan?

Chen Xie
sumber
1
Saya tidak berpikir ada alat yang mengubah kode menjadi kode yang kompatibel dengan PEP8. PEP8 juga menyertakan aturan penamaan variabel, jadi, jika alat seperti itu ada maka itu akan mengganti nama nama variabel Anda juga dan Anda mungkin tidak dapat memahami kode Anda sendiri.
Ashwini Chaudhary
1
@AshwiniChaudhary Itu poin yang bagus, perlu juga disebutkan bahwa mengubah nama variabel dapat memengaruhi orang lain yang sudah menggunakan kode Anda, karena itu tidak selalu merupakan ide yang baik. (autopep8 tidak melakukan ini.)
Andy Hayden

Jawaban:

38

Sayangnya "pep8 storming" (seluruh proyek) memiliki beberapa efek samping negatif:

  • banyak konflik gabungan
  • hentikan kesalahan
  • mempersulit tinjauan kode

Sebagai alternatif (dan terima kasih kepada @yp untuk idenya ), saya menulis paket kecil yang autopep8s hanya baris-baris yang telah Anda kerjakan sejak komit / cabang terakhir:

Pada dasarnya meninggalkan proyek sedikit lebih baik daripada yang Anda temukan :

pip install pep8radius

Misalkan Anda telah menyelesaikan pekerjaan Anda masterdan siap untuk berkomitmen:

# be somewhere in your project directory
# see the diff with pep, see the changes you've made since master
pep8radius master --diff
# make those changes
pep8radius master --diff --in-place

Atau untuk membersihkan baris baru yang Anda lakukan sejak komit terakhir:

pep8radius --diff
pep8radius --diff --in-place

# the lines which changed since a specific commit `git diff 98f51f`
pep8radius 98f51f --diff

Pada dasarnya pep8radiusadalah menerapkan autopep8 ke baris dalam keluaran git / hg diff (dari komit bersama terakhir ).

Skrip ini sekarang bekerja dengan git dan hg, jika Anda menggunakan sesuatu yang lain dan ingin ini berfungsi, silakan kirim komentar / masalah / PR !

Andy Hayden
sumber
2
+1 Inisiatif yang sangat bagus ... saya sedang memikirkan cara membuat plugin Notepad ++ untuk tujuan yang sama ... karena itu adalah editor favorit saya di Windows
kmonsoor
1
@kmonsoor Ide bagus, saya belum memikirkan plugin editor! Beri tahu saya di github dengan cara apa pun saya dapat membantu / mempermudah penggunaan di luar CLI ... Saya melihat beberapa masalah (dapat diselesaikan).
Andy Hayden
di sini saya menemukan daftar plugin editor yang menarik github.com/jcrocholl/pep8/wiki/RelatedTools , meskipun tidak beruntung untuk Notepad ++ ...
kmonsoor
1
Saya baru saja membuat skrip untuk menjembatani antara Notepad ++ dan Autopep8, berdasarkan plugin lain "Python Script". Namun, itu berhasil. Silakan
kmonsoor
185

Anda dapat menggunakan autopep8 ! Saat Anda membuat sendiri secangkir kopi, alat ini dengan senang hati menghapus semua pelanggaran PEP8 yang tidak mengubah arti kode.

Instal melalui pip:

pip install autopep8

Terapkan ini ke file tertentu:

autopep8 py_file --in-place

atau untuk proyek Anda (secara rekursif), opsi verbose memberi Anda beberapa umpan balik tentang bagaimana kelanjutannya :

autopep8 project_dir --recursive --in-place --pep8-passes 2000 --verbose

Catatan: Terkadang default 100 lintasan tidak cukup, saya menetapkannya ke 2000 karena cukup tinggi dan akan menangkap semua kecuali file yang paling merepotkan (berhenti lewat begitu tidak menemukan pelanggaran pep8 yang dapat diselesaikan) ...

Pada titik ini saya menyarankan untuk menguji ulang dan melakukan komit!

Jika Anda ingin kepatuhan PEP8 "penuh" : satu taktik yang saya gunakan adalah menjalankan autopep8 seperti di atas, kemudian jalankan PEP8, yang mencetak pelanggaran yang tersisa (file, nomor baris, dan apa):

pep8 project_dir --ignore=E501

dan mengubahnya secara manual satu per satu (mis. E712s - perbandingan dengan boolean).

Catatan: autopep8 menawarkan --aggressiveargumen (untuk "memperbaiki" pelanggaran yang mengubah arti ini dengan kejam), tetapi berhati-hatilah jika Anda menggunakan agresif, Anda mungkin harus men-debug ... (misalnya di numpy / pandas True == np.bool_(True)tetapi tidak True is np.bool_(True)!)

Anda dapat memeriksa berapa banyak pelanggaran dari setiap jenis (sebelum dan sesudah):

pep8 --quiet --statistics .

Catatan: Saya menganggap E501s (baris terlalu panjang) adalah kasus khusus karena mungkin akan ada banyak di kode Anda dan terkadang ini tidak diperbaiki oleh autopep8.

Sebagai contoh, saya menerapkan teknik ini ke basis kode pandas .

Andy Hayden
sumber
@hayden Apakah Anda memiliki komentar tentang seberapa dapat diandalkan ini, dan rasio perbaikan otomatis untuk masalah aneh yang ditimbulkannya?
Marius
@Marius Saya menggunakan ini pada kode pandas (yang cukup besar) dan tidak menunjukkan masalah aneh, itu tidak akan mengubah kode yang mengubah artinya , saya telah memperbarui jawaban saya untuk menyebutkan ini. Sebelumnya ada masalah dengan hashbang Sphinx (bug di PEP8 sekarang sudah diperbaiki).
Andy Hayden
2
Apakah ini memberlakukan Strunk and White dalam komentar?
Eric
1
Mulai 25 Okt 2017, pep8paket yang disebutkan dalam jawaban ini telah diubah namanya menjadi pycodestyle: github.com/PyCQA/pycodestyle/releases/tag/1.7.1
hb20007
8

@Andy Hayden memberikan gambaran yang bagus tentang autopep8. Selain itu ada satu paket lagi bernama pep8ify yang juga berfungsi sama.

Namun kedua paket hanya dapat menghapus kesalahan lint tetapi tidak dapat memformat kode.

little = more[3:   5]

Kode di atas tetap sama setelah pep8ifying juga. Tapi kodenya belum terlihat bagus. Anda dapat menggunakan format seperti yapf , yang akan memformat kode meskipun kode tersebut sesuai dengan PEP8. Kode di atas akan diformat menjadi

little = more[3:5]

Beberapa kali ini bahkan merusak pemformatan manual Anda. Sebagai contoh

BAZ = {
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12]
}

akan diubah menjadi

BAZ = {[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]}

Tetapi Anda dapat mengatakannya untuk mengabaikan beberapa bagian.

BAZ = {
   [1, 2, 3, 4],
   [5, 6, 7, 8],
   [9, 10, 11, 12]
}  # yapf: disable

Diambil dari posting blog lama saya: Secara Otomatis PEP8 & Format Kode Python Anda!

ChillarAnand
sumber
2
Apakah little = more[3: 5]bug di pep8 (perpustakaan)? yapf jelas merupakan masa depan di sini, algoritme di belakangnya (pada dasarnya jalur terpendek dalam grafik dari semua opsi pemformatan) adalah solusi yang sangat elegan, dan kemungkinan akan memiliki lebih sedikit bug serta pemformatan kanonik.
Andy Hayden
@AndyHayden Sepertinya itu adalah fitur yang hilang, itu tidak memperbaiki E225
ChillarAnand
5

Jika Anda menggunakan eclipse + PyDev, Anda cukup mengaktifkan autopep8 dari pengaturan PyDev: Windows -> Preferensi -> ketik 'autopep8' di filter pencarian.

Periksa 'gunakan autopep8.py untuk pemformatan kode?' -> OK

Sekarang format kode CTRL-SHIFT-F eclipse harus memformat kode Anda menggunakan autopep8 :)

tangkapan layar

mork
sumber
3

Saya melakukan penelitian luas tentang berbagai instrumen untuk python dan gaya kode. Ada dua jenis instrumen: linter - menganalisis kode Anda dan memberikan beberapa peringatan tentang gaya kode bekas yang buruk dan menunjukkan saran cara memperbaikinya, dan pemformat kode - saat Anda menyimpan file, format ulang dokumen Anda menggunakan gaya PEP.

Karena pemformatan ulang harus lebih akurat - jika mengingat sesuatu yang tidak Anda inginkan menjadi tidak berguna - format ulang mencakup lebih sedikit bagian dari PEP, linter menampilkan lebih banyak.

Semuanya memiliki izin yang berbeda untuk konfigurasi - misalnya, pylinter dapat dikonfigurasi di semua aturannya (Anda dapat mengaktifkan / menonaktifkan setiap jenis peringatan), hitam tidak dapat dikonfigurasi sama sekali.

Berikut beberapa tautan dan tutorial berguna:

Dokumentasi:

Linters (dalam urutan popularitas):

Pemformat kode (dalam urutan popularitas):

Mikhail_Sam
sumber
1

Ada banyak.

IDE biasanya memiliki beberapa kemampuan pemformatan bawaan. IntelliJ Idea / PyCharm memilikinya, hal yang sama berlaku untuk plugin Python untuk Eclipse, dan seterusnya.

Ada pemformat / linter yang dapat menargetkan banyak bahasa. https://coala.io adalah contoh yang bagus dari itu.

Lalu ada alat tujuan tunggal, yang banyak di antaranya disebutkan dalam jawaban lain.

Salah satu metode khusus pemformatan ulang otomatis adalah dengan mengurai file menjadi pohon AST (tanpa menghapus komentar) dan kemudian membuangnya kembali ke teks (artinya tidak ada format asli yang dipertahankan). Contohnya adalah https://github.com/python/black .

pengguna7610
sumber