Cara Menulis Sintaks Python Lengkap
Style Guide pada Kode Python
Berikut adalah beberapa panduan gaya untuk menulis kode Python dengan baik dan benar. Panduan gaya penulisan kode ini mengacu pada PEP-008. Beberapa proyek mungkin memiliki panduan gayanya sendiri.
Beberapa contoh kode yang ditulis pada halaman ini berbentuk pseudocode, dimaksudkan untuk memberikan gambaran tentang panduan gaya kode saja.
Guido, pencipta bahasa Python, merasa bahwa kode lebih sering dibaca daripada ditulis. Untuk alasan ini, panduan ini sangat menekankan pada kode yang mudah dibaca dan membuatnya konsisten di (hampir) setiap proyek Python yang ada.
Namun, dalam kasus tertentu, keputusan untuk memodifikasi tetap berada pada pembuat kode. Mungkin sebuah kode dapat dibaca dengan lebih jelas meskipun tidak mengikuti satu atau beberapa pedoman dalam artikel ini.
Indentasi
Gunakan 4 spasi pada setiap tingkat indentasi.
Python sendiri menggunakan indentasi untuk menulis kode bertingkat. Mungkin bahasa lain menggunakan pernyataan tertentu (Begin, end – pascal), perbedaan baris serta kurung kurawal.
Pernyataan yang memiliki indentasi yang sama dan ditempatkan secara berurutan dikenali sebagai pernyataan blok oleh Python dan akan dieksekusi secara berurutan.
Statement tingkat 1:
Statement tingkat 2()
Statement tingkat 2 yang kedua()
Baris Lanjutan
Seringkali saat menulis kode, kita harus menggunakan baris lanjutan karena kode tidak cukup untuk ditulis dalam satu baris. Secara umum, kita dapat menggunakan tanda hubung, tanda kurung, kurung kurawal, atau seperti yang disarankan dalam PEP-008, gunakan hanging indent.
Beberapa panduan penggunaan hanging indent dalam penulisan kode Python adalah sebagai berikut:
Disarankan:
# Opsi 1
# Rata kiri dengan kurung atau pemisah dengan argumen utama
foo = long_function_name(var_one, var_two,
var_three, var_four)
# Opsi 2
# Tambahkan indentasi ekstra - (level indentasi baru) untuk memisahkan parameter/argument dari bagian lainnya
def long_function_name(
var_one, var_two, var_three,
var_four):
print(var_one)
# Opsi 3
# Hanging indents dengan penambahan level indentasi saja
foo = long_function_name(
var_one, var_two,
var_three, var_four)
Tidak Disarankan:
# Contoh kesalahan 1
# Tidak rata kiri dengan bagian yang relevan
foo = long_function_name(var_one, var_two,
var_three, var_four)
# Contoh kesalahan 2
# Sulit dibedakan antara baris lanjutan atau fungsi baru
def long_function_name(
var_one, var_two, var_three,
var_four):
print(var_one)
Catatan: 4 spasi bersifat opsional pada baris lanjutan, utamakan keterbacaan kode.
Kamu juga dapat menggunakan jumlah spasi lain (misalnya 2) untuk baris lanjutan ini. Contohnya seperti ini:
# Hanging indents *boleh* menggunakan selain 4 spasi
foo = long_function_name(
var_one, var_two,
var_three, var_four)
Kondisional (If)
Bagian ini hanya memberikan gambaran standar penulisan, pembahasan kondisional ada di artikel percabangan.
Saat menulis pernyataan bersyarat, misalnya IF, kita juga menemukan bahwa menulis terkadang tidak cukup untuk menulis dalam satu baris, atau bahkan menggunakan beberapa operand yang akan sulit apabila digabungkan dalam satu baris. Dalam kondisi tersebut, Python tidak memberikan panduan khusus, mengingat kondisi yang dihadapi programmer bisa saja berbeda. Contoh yang disarankan adalah sebagai berikut (walaupun versi lain dimungkinkan selama keterbacaan kode tetap tinggi):
# Contoh kondisi visual yang tidak diubah/tanpa indentasi
if (sebuah kondisi dan
kondisi yang lain):
lakukanSesuatu()
# Tambahkan komentar
if (sebuah kondisi dan
kondisi yang lain):
#Mengingat Keduanya Benar, lakukan hal berikut
lakukanSesuatu()
# Tambahkan ekstra indentasi pada baris lanjutan
if (sebuah kondisi dan
kondisi yang lain):
lakukanSesuatu()
Kurung/Siku Penutup
Penempatan tanda kurung atau siku penutup juga dapat diletakkan pada baris berikutnya, mengikuti posisi karakter pertama yang bukan whitespace (non-whitespace character) pada baris sebelumnya:
my_list = [
1, 2, 3,
4, 5, 6,
]
result = some_function_that_takes_arguments(
'a', 'b', 'c',
'd', 'e', 'f',
)
Atau dapat ditempatkan sejajar dengan pernyataan utama, misalnya:
my_list = [
1, 2, 3,
4, 5, 6,
]
result = some_function_that_takes_arguments(
'a', 'b', 'c',
'd', 'e', 'f',
)
Tab atau Spasi
Spasi adalah model yang direkomendasikan PEP-008. Pengecualian untuk kode yang sudah menggunakan tab/tabulasi sebelumnya. Python sejak versi 3 tidak mengizinkan pencampuran antara Tab dan Spasi untuk indentasi. Kamu disarankan untuk mengonversi kode agar menggunakan spasi sepenuhnya. Kamu dapat menggunakan find-replace untuk mengganti tab, atau memanggil kode berbasis Python 2 kamu dengan opsi -t (warning) atau -tt (error) untuk mencari tahu di mana tab dan spasi tercampur.
Panjang Baris Maksimum
Batasi panjang kode per baris hingga 79 karakter. Untuk komentar atau dokumentasi, usahakan jangan melebihi 72 karakter.
Dengan membatasi panjang baris maksimum, kamu akan memudahkan pengguna lain untuk membuka >1 jendela editor secara berdampingan, misalnya untuk melakukan review atau perbandingan.
Panjang kode per baris yang terbatas memudahkan kamu menggunakan code review tools yang menampilkan dua versi berbeda secara berdampingan.
Mengapa 79? Ini dicontohkan dalam editor dengan lebar jendela diatur ke 80 karakter.
1 karakter yang tersisa dapat berupa marker glyph atau whitespace. Batasan 79 karakter ini berarti bahwa editor terkecil sekalipun tidak akan merusak struktur dan keterbacaan kode kamu. Jika kamu atau tim kamu mengalami kesulitan (misalnya karena struktur penamaan variabel) yang telah kamu sepakati cenderung melebihi batas panjang karakter, kamu dapat melakukan konvensi atau kesepakatan yang berlaku untuk kode kamu sendiri.
Umumnya hingga 99 karakter per baris.
Catatan: Python Standard Library selalu dikembangkan secara konservatif dan mempertahankan default 79 karakter dalam kode, dan 72 dalam komentar/dokumentasi.
Seperti yang telah dibahas sebelumnya, kamu disarankan untuk menggunakan baris lanjutan dengan kurung, kurawal, siku, maupun hanging indents.
Baris panjang dapat dibagi menjadi beberapa baris. Beberapa dari kamu mungkin akrab dengan pemisahan menggunakan backslash (\), tetapi tidak disarankan untuk menggunakannya, kecuali benar-benar diperlukan. Contohnya adalah dalam penggunaan backslash pada statement with atau assert yang tidak bisa menggunakan implicit continuation.
with open('/path/to/some/file/you/want/to/read') as file_1, \
open('/path/to/some/file/being/written', 'w') as file_2:
file_2.write(file_1.read())
Pastikan untuk memberikan indentasi yang sesuai pada baris.
Mengganti Baris: sebelum atau sesudah operator binary?
Bagian ini hanya memberikan gambaran tentang standar penulisan, pembahasan tentang kondisional dibahas dalam artikel Operator, Operands, dan Expressions. Mengganti baris setelah operator biner pernah menjadi rekomendasi. Namun, ternyata menggunakan cara ini membuat mata cepat lelah dan perlu dilakukan cross check pada baris yang berbeda. Sebagai contoh:
income = (gross_wages + taxable_interest + (dividends - qualified_dividends) - ira_deduction - student_loan_interest)
Untuk mengatasi masalah ini, pendekatan baris baru dipilih sebelum operator biner. Ini untuk memudahkan pembaca kode memahami operasi yang dilakukan pada variabel berikutnya.
income = (gross_wages + taxable_interest + (dividends - qualified_dividends) - ira_deduction - student_loan_interest)
Kedua pendekatan ini dimungkinkan dengan Python. Disarankan agar kamu menggunakan pendekatan kedua (baris baru sebelum operator) untuk menulis kode baru.
Baris Kosong
Disarankan agar kamu menambahkan dua baris kosong pada top level function dan class definitions. Kemudian untuk setiap deklarasi method, dipisahkan dengan satu baris kosong.
Kamu juga dapat menambahkan baris kosong ini bila diperlukan, misalnya untuk memisahkan kombinasi beberapa fungsi yang memiliki fungsi terkait atau untuk meningkatkan keterbacaan kode. Pemisahan baris kosong tidak diperlukan jika deklarasi fungsi/metode kamu adalah one-liner, umumnya untuk fungsi/metode yang belum sepenuhnya diterapkan.
File Encoding
Kode dalam inti Python, selalu menggunakan encoding UTF-8 (Python 3) atau ASCII (Python 2). Pada kasus ini, apabila dalam sebuah berkas tidak ditulis deklarasi encoding, maka berkas tersebut menggunakan encoding ASCII (Python 2) atau UTF-8 (Python 3). Dalam standard library, non-default encoding hanya digunakan untuk pengujian atau memberikan sebuah komentar/dokumentasi, misalnya nama penulis tidak menggunakan karakter ASCII.
Untuk Python 3 dan seterusnya, pada standard library hanya menggunakan karakter ASCII dan sebisa mungkin menggunakan kata-kata dalam Bahasa Inggris. Proyek yang menggunakan Python 3 didorong untuk menggunakan standar yang sama. Lihat PEP 3131.
Import
Saat mengimpor library, impor setiap library pada baris yang berbeda.
Yes: import os
import sys
No: import sys, os
Kecuali, jika kamu membutuhkan lebih dari satu sub-library dari library yang sama.
from subprocess import Popen, PIPE
Impor umumnya ditempatkan di awal file. Setelah komentar dan dokumentasi tentang file (misalnya definisi kelas, dll.), sebelum variabel global dan konstanta. Jika memungkinkan, kelompokkan impor dalam urutan berikut:
- Standard Library
- Library Pihak Ketiga
- Local/Library spesifik
Setiap grup sebaiknya dipisahkan dengan baris kosong.
Dalam Python 2 dikenal dengan istilah relative import eksplisit, yaitu proses import yang menggunakan jalur relative yang digunakan. Di Python 3, semua impor adalah mutlak (bersama dengan semua jalur secara penuh).
import mypkg.sibling
from mypkg import sibling
from mypkg.sibling import example
Kode pada Standard library sendiri umumnya dapat menggunakan absolute import. Kamu juga dapat mengimpor kelas/sub-library, tentu saja kamu dapat menggunakan pemanggilan berikut ini:
from myclass import MyClass
from foo.bar.yourclass import YourClass
Jika ada nama kelas yang sama, gunakan pemanggilan secara eksplisit:
import myclass
import foo.bar.yourclass
Saat memanggil, gunakanlah “myclass.MyClass” dan “foo.bar.yourclass.YourClass”.
from import *
Wildcard imports seperti tertulis, sedapat mungkin dihindari untuk mengatasi ambiguitas dan ketidaktahuan tentang modul apa yang di-import.
Tanda Petik
Petik tunggal (‘) dan petik ganda (“) dianggap sama oleh Python, dan tidak memiliki preferensi khusus untuk penggunaannya. Hal ini dikarenakan ada kemungkinan string yang memuat salah satunya. Kamu disarankan untuk menggunakan salah satunya secara konsisten.
Docstring (dokumentasi kode/fungsi/method) pada Python didefinisikan dengan tiga tanda petik, disarankan tanda petik ganda (”””) pada awal dan akhir statement docstring.
Whitespace pada Expressions dan Statements
Wajib dihindari: penambahan whitespace yang tidak perlu
Antara kurung, kurawal, kurung siku
Yes: spam(ham[1], {eggs: 2})
No: spam( ham[ 1 ], { eggs: 2 } )
Setelah koma, tanpa argumen lain setelahnya
Yes: foo = (0,)
No: bar = (0, )
Sebelum koma, titik dua, atau titik koma
Yes: if x == 4: print x, y; x, y = y, x
No: if x == 4 : print x , y ; x , y = y , x
Namun, jika kamu menggunakan titik dua/colon sebagai slice (sub-list), pastikan ia memiliki spasi/whitespace yang sama pada kedua sisinya.
Yes:
ham[1:9], ham[1:9:3], ham[:9:3], ham[1::3], ham[1:9:]
ham[lower:upper], ham[lower:upper:], ham[lower::step]
ham[lower+offset : upper+offset]
ham[: upper_fn(x) : step_fn(x)], ham[:: step_fn(x)]
ham[lower + offset : upper + offset]
No:
ham[lower + offset:upper + offset]
ham[1: 9], ham[1 :9], ham[1:9 :3]
ham[lower : : upper]
ham[ : upper]
Saat memberikan parameter pada fungsi, sebelum kurung tidak boleh ada spasi
Yes: spam(1)
No: spam (1)
Saat memberikan parameter/index pada list, sebelum kurung siku tidak boleh ada spasi
Yes: dct['key'] = lst[index]
No: dct ['key'] = lst [index]
Saat membuat assignment pada variabel, sebaiknya tidak menambahkan whitespace yang tidak perlu
Yes:
x = 1
y = 2
long_variable = 3
No:
x = 1
y = 2
long_variable = 3
Rekomendasi Lainnya
Hindari menambahkan whitespace di belakang statement apapun, utamanya di statement akhir dalam sebuah baris, karena whitespace tersebut tidak mudah dilihat.
Biasakan untuk menambahkan satu spasi baik di kiri maupun kanan untuk operasi berikut:
- Assignment (=)
- Augmented assignment (+=, -=etc.)
- Comparisons (==, , !=, , =, in, not in, is, is not)
- Booleans (and, or, not)
Jika operator dengan berbagai tingkatan prioritas digunakan, letakkan whitespace pada operator-operator dengan prioritas terendah. Namun kamu juga dapat menyesuaikannya sendiri.
Catatan: jangan pernah menggunakan >1 spasi dan gunakan spasi yang sama baik di sebelah kiri maupun kanan dari operator-operator binary kamu.
Yes:
i = i + 1
submitted += 1
x = x*2 - 1
hypot2 = x*x + y*y
c = (a+b) * (a-b)
No:
i=i+1
submitted +=1
x = x * 2 - 1
hypot2 = x * x + y * y
c = (a + b) * (a - b)
Komentar
Dalam sebuah kode Python, kamu diajak untuk memastikan kode kamu terbaca oleh programmer lain. Salah satu caranya adalah dengan menggunakan fitur komentar untuk memberitahu fungsi atau informasi lain terkait kode kamu. Pastikan komentar kamu ter-update dan tidak mengalami kontradiksi dengan kode yang ada.
Umumnya, komentar dituliskan dalam kalimat utuh dengan memperhatikan penulisan (huruf besar di awal kalimat, huruf kecil saat diawali dengan identifier atau variabel, dan diakhiri titik di akhir kalimat). Kamu juga bisa menggabungkan beberapa kalimat menjadi blok komentar dengan menambah dua spasi saat berganti kalimat dalam satu paragraf, kecuali pada kalimat terakhir. Jika memungkinkan, tuliskan komentar dalam bahasa Inggris, kecuali kamu yakin bahwa pembaca komentar ini dipastikan mengerti bahasa kamu.
Blok Komentar
Blok komentar umumnya digunakan untuk menjelaskan fungsi utuh atau sub-fungsi yang mengikuti/berada di bawahnya. Blok komentar diindentasi setara dengan kode yang dijelaskan. Setiap barisnya diawali dengan # dan sebuah spasi serta setiap paragrafnya dimulai pada baris baru.
Komentar Inline
Komentar Inline pada Python umumnya diletakkan pada baris yang sama dengan kode. Umumnya dipisahkan dan dirapikan dengan jarak dua spasi dari kode yang dimaksud, diawali # dan sebuah spasi.
Komentar inline dapat juga digunakan di atas baris yang ingin diberikan komentar, agar tidak mengurangi jumlah karakter yang dapat dituliskan dalam sebuah baris. Untuk semua jenis komentar, jangan menuliskan komentar untuk hal yang sudah langsung dapat dibaca dari kodenya, seperti contoh berikut:
Tidak disarankan:
x = x + 1 # Tambahkan x
Disarankan (kontekstual):
x = x + 1 # Mengakomodasi layar ukuran Z
Dokumentasi
Guideline untuk menuliskan dokumentasi (docstring) yang baik tersedia di PEP 257. Kuncinya:
- Buatlah dokumentasi untuk semua modul, fungsi, kelas, dan method yang bersifat public atau akan diakses publik.
- Docstring tidak diwajibkan pada method yang tidak bersifat public, namun kamu disarankan menambahkan komentar tentang Apa saja yang dilakukan fungsi/modul ini beserta informasi lainnya yang mungkin diperlukan. Komentar ini diletakkan setelah baris def.
PEP 257 memberikan panduan detil yang dapat digunakan. Seperti yang sudah-sudah, kamu disarankan untuk menutup sebuah docstring yang lebih dari satu baris, pada baris baru berikutnya:
"""Return a foobang
Optional plotz says to frobnicate the bizbaz first.
"""
Untuk dokumen baris tunggal, kamu disarankan untuk menempatkan akhiran “”” pada baris yang sama.
Meskipun secara sintaksis kamu bisa menggantikan 3-tanda-kutip-dua “”” dengan 3-tanda-kutip-satu ”’, untuk penulisan komentar multi-baris, tetapi PEP 257 memberikan panduan gunakan 3-tanda-kutip-dua untuk dokumentasi (docstring)