Python Auto Formatter: Autopep8 vs. Black (dan beberapa tips praktis)
Inilah kesimpulannya: Saya lebih suka hitam sebagai alat pemformatan otomatis, tetapi ada beberapa tip praktis (pada akhirnya) yang harus Anda ingat, dan ini bekerja paling baik secara paralel dengan beberapa alat lain seperti isort.
pengantar
Autopep8 dan Black adalah alat hebat untuk memformat otomatis kode Python Anda agar sesuai dengan panduan gaya PEP 8 . Hitam memiliki 30,4k bintang di GitHub dan mungkin merupakan alat paling populer dari jenisnya, sedangkan autopep8 memiliki 4,2k bintang.
Salah satu perbedaan utama adalah bahwa hitam adalah pemformat yang berpendirian, artinya ia selalu mengubah seluruh basis kode menjadi gayanya sendiri, sedangkan autopep8 mempertahankan gaya input sampai batas tertentu dan hanya memperbaiki bagian yang diperlukan.
Saya telah menggunakan kedua alat tersebut dalam pekerjaan saya dan saya ingin berbagi dengan Anda mengapa saya lebih memilih warna hitam daripada autopep8.
Masalah dengan autopep8
1. Mengurutkan impor secara agresif
Beberapa orang mungkin melihat ini sebagai hal yang baik, namun menurut saya alat yang baik harus fokus pada satu hal dan hanya satu hal. Sebagai alat pemformatan, seharusnya tidak mencoba mengubah urutan kode, dan memang, terkadang dapat menimbulkan masalah.
Mari kita perhatikan contoh di bawah ini. Meskipun sys.path.appendumumnya bukan praktik yang baik, tapi anggap saja kita benar-benar ingin melakukan sesuatu terlebih dahulu sebelum mengimpor modul lainnya.
Autopep8 akan menulis ulang skrip menjadi sebagai berikut:
Dan ini bermasalah. Contoh lain yang dapat saya pikirkan adalah jika kita ingin mengaktifkan backend matplotlib untuk terminal linux, kita perlu mengatur backend matplotlib.use("agg") sebelum pyplot import from matplotlib import pyplot as plt.
Sebaliknya, warna hitam tidak akan mengubah kode contoh di atas. Hitam hanya pemformatan dan semantik kode tetap persis sama. Dengan kata lain, hitam tidak mengurutkan impor Anda dan tidak mengubah urutan kode Anda. (dan kita dapat meninggalkan tugas menyortir impor untuk isor alat hebat lainnya , silakan lanjutkan membaca!)
Anda masih dapat menyelesaikan masalah dengan menambahkan # nopep8beberapa cuplikan kode Anda, secara eksplisit memberi tahu autopep8 untuk tidak menyentuhnya:
Ini berfungsi dalam kasus ini, tetapi saya menemukan bahwa # nopep8aturan pengecualian tidak diterapkan pada komentar, misalnya autopep8 masih akan mengubah yang berikut ### some comment # nopep8menjadi # some comment # nopep8.
Di sisi lain, hitam tidak mengedit komentar dan dokumen, dan Anda dapat mengecualikan beberapa kode Anda dari pemformatan dengan menambahkan dua baris komentar # fmt: offdan # fmt: onsebelum dan sesudah blok kode Anda.
Ngomong-ngomong, itu tidak terlalu Pythonic, kan?
2. Tidak menegakkan lekukan dengan benar
Indentasi default Autopep8 disetel sama dengan ukuran tab editor Anda, dan Anda dapat menentukan nilainya dengan meneruskan opsi autopep8 --indent-size 4 myfile.py. Semua baik-baik saja, bagaimanapun, autopep8 hanya memasukkan nilai ini untuk mengatur indentasi untuk awal setiap pernyataan, tetapi ukuran indentasi dalam tanda kurung selalu diatur ke ukuran tab default.
Mari kita lihat contoh ini, di mana indentasi kode adalah 1, dan ukuran tab default editor saya adalah 4.
Setelah menyetel lekukan ke 3 dengan autopep8 autopep8 --indent-size 3 format_02_raw.py -i (-i mean in place) , kami mendapatkan yang berikut:
Kita dapat melihat bahwa lekukan pada fungsi pertama disetel dengan benar ke 3, tetapi apa pun di dalam tanda kurung (dalam hal ini, pernyataan cetak dan matriks) malah disetel ke ukuran tab default 4.
Saya menemukan ini karena ukuran tab default di lingkungan kerja saya adalah 2, dan saya lebih suka lekukan 4. Ini mungkin terdengar sepele tetapi mengapa mengambil risiko ketidakkonsistenan yang tidak perlu? Hitam tidak memungkinkan Anda untuk mengonfigurasi ukuran indentasi, karena selalu menetapkan indentasi ke 4 di semua tempat, yang sama sekali tidak saya pedulikan.
Menggunakan hitam dengan cara yang benar
Hitam menerapkan gayanya sendiri, yang disukai sebagian orang dan sebagian tidak. Saya sangat menyukainya karena umumnya sangat bersih dan mudah dibaca, tetapi ada dua hal yang perlu diingat.
1. Gunakan tanda koma
Contoh di bawah ini mungkin menunjukkan salah satu alasan paling umum mengapa sebagian orang tidak menyukai warna hitam. Mari kita lihat sebelum dan sesudahnya:
Ini menjengkelkan, tetapi sebelum Anda marah, mari buat beberapa perubahan kecil pada kode dan lihat bagaimana black mengubah perilakunya:
Ya, hitam menggunakan tanda koma untuk memutuskan apakah item akan digabungkan atau tetap di baris baru. Jika item seperti array berakhir tanpa tanda koma, apakah itu daftar, matriks, atau kamus, hitam selalu mencoba membengkokkannya dalam satu baris; jika melebihi panjang garis, hitam lalu letakkan isinya di baris baru dan tambahkan tanda koma untuk Anda . Jika ada tanda koma di item, hitam memisahkan isinya ke baris baru untuk Anda .
Singkatnya, akan selalu ada tanda koma di mana pun konten item seperti array berada di baris baru. Saya pikir ini masuk akal, dan secara umum membuntuti koma adalah praktik yang baik karena membuat kode lebih mudah dipelihara, serta menghasilkan bersih git diffsaat Anda membuat perubahan. Jadi jika Anda tidak ingin hitam membungkus kode Anda menjadi satu baris, tambahkan koma di bagian akhir!
Kiat bonus: ketika saya menulis kueri SQL, saya akan menulis
SELECT column_a
,column_b
,column_c
FROM some_table
SELECT column_a,
column_b,
column_c
FROM some_table
2. Tentukan panjang garis jika diperlukan
Satu-satunya hal yang saya tidak suka tentang gaya kode hitam sejauh ini adalah tentang pernyataan if yang panjang, seperti contoh di bawah ini:
Itu menegakkan konsistensi tetapi mengorbankan keterbacaan. Panjang garis default Black adalah 88, tetapi kadang-kadang saya memiliki pernyataan yang sedikit lebih panjang dan saya tidak ingin diformat seperti itu.
Solusi saya adalah membiarkan panjang garis sedikit lebih panjang. Kita dapat menentukan panjang garis menggunakan --line-lengthatau -lmenandai, dan jika kita mengatur panjang garis menjadi 100 black -l 100 format_05_raw.py, contoh di atas tidak akan diformat ulang. Dari pengalaman saya, panjang baris 100-ish akan sesuai dengan sebagian besar pernyataan panjang sambil tetap mempertahankan keterbacaan kode yang baik (walaupun Anda harus benar-benar mempertimbangkan untuk menulis ulang pernyataan Anda jika panjangnya lebih dari 100 karakter), tetapi tentu saja, ini terserah masing-masing tim untuk memutuskan. .
Autopep8 juga memiliki flag seperti itu --max-line-length, namun, karena autotpep8 cenderung mempertahankan gaya kode asli, hasil pemformatan jauh lebih tidak sensitif terhadap panjang garis yang ditentukan daripada hitam.
3. Gunakan warna hitam dengan isort
Seperti yang saya sebutkan sebelumnya, hitam tidak mengurutkan impor Anda, dan kami dapat menggunakan isort (bintang 5,4k di GitHub) untuk melakukan ini. Mari kita lihat contoh singkat tentang apa yang dapat dilakukan isortasi:
Itu rapi dan tidak mengacaukan sys.path.appendcontoh kita.
Perhatikan bahwa ada sedikit perbedaan antara cara isort dan black mengatur impor, dan kita dapat memberi tahu isort untuk mengurutkan impor sesuai dengan gaya kode hitam isort --profile black format_06_raw.py.
Kami sekarang memiliki alur kerja yang cukup bagus: gunakan isort untuk mengurutkan impor terlebih dahulu, lalu gunakan hitam untuk memformat kode kami. Kita dapat menggabungkan kedua langkah tersebut bersama-sama di Makefile:
format:
isort --profile black src/
black -l 100 src/
Kesimpulan
Pada artikel ini kami membandingkan dua alat pemformatan otomatis populer dengan Python — autopep8 dan hitam. Saya menjelaskan mengapa saya lebih suka warna hitam dan bagaimana saya suka menggunakannya, dan semoga bermanfaat.
Ini juga pertama kalinya saya menulis artikel di Medium, silakan beri saya tepuk tangan jika Anda menyukainya dan jangan lupa tinggalkan komentar Anda di bawah, dan sampai jumpa lagi!

![Apa itu Linked List? [Bagian 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































