- Memperkenalkan 14 fitur tingkat lanjut Python yang jarang diketahui beserta contoh nyata
- Memberikan penjelasan mendalam tentang static typing dan desain struktural seperti
typing, generics, protocols, dan context managers
- Juga mencakup structural pattern matching yang baru diperkenalkan mulai Python 3.10+, serta teknik optimasi performa seperti slots dan metaclass
- Memuat tips untuk menulis kode yang rapi seperti
f-string, cache, future, proxy, for-else, dan walrus
- Untuk tiap fitur, tersedia tautan dan referensi untuk pembelajaran lanjutan, dengan susunan yang tetap mudah diikuti oleh developer junior
Ringkasan 14 Fitur Python Tingkat Lanjut
# Overload Typing
- Dekorator
@overload memungkinkan mendefinisikan beberapa type signature untuk satu fungsi
- Type checker dapat menyimpulkan return type secara akurat sesuai nilai argumen yang diberikan
- Dengan memanfaatkan
Literal, kita juga bisa membatasi nilai string
- Juga dapat mengimplementasikan signature fungsi yang mewajibkan hanya salah satu dari
id atau username
Literal dapat dipakai sebagai pengganti Enum yang ringan untuk menjaga type safety
# Argumen keyword-only / positional-only
- Dengan
*, argumen dapat diatur sebagai keyword-only (argumen posisi tidak diperbolehkan)
- Dengan
/, argumen dapat diatur sebagai positional-only (argumen keyword tidak diperbolehkan)
- Saat merancang API, ini memungkinkan kita memaksa cara penggunaan argumen dengan jelas
# Future annotations (__future__)
- Type hint pada dasarnya langsung dievaluasi saat runtime, sehingga bisa menimbulkan masalah urutan deklarasi
- Dengan
from __future__ import annotations, kita bisa menunda waktu evaluasi
- Namun karena pendekatan ini memakai pemrosesan string, perlu hati-hati saat menggunakan tipe di runtime
PEP 649 mengusulkan perbaikan dengan evaluasi tertunda melalui atribut __annotations__
# Sintaks Generic
- Mulai Python 3.12, tersedia sintaks baru untuk mendefinisikan generic type
- Alih-alih
TypeVar, kini bisa ditulis lebih intuitif dalam bentuk class Foo[T, U: int]
- Variadic Generics juga diperkenalkan untuk menangani beragam tipe
- Definisi type alias juga menjadi lebih ringkas, misalnya
type Vector = list[float]
# Protocols
- Merupakan versi type checking dari Duck Typing yang memungkinkan structural subtyping
- Jika sebuah kelas memiliki metode tertentu, ia bisa kompatibel secara tipe meski tanpa mewarisi tipe tersebut
- Dengan
@runtime_checkable, ini juga dapat diperluas agar mendukung pemeriksaan isinstance
# Context Manager
- Objek dengan metode
__enter__ dan __exit__ yang digunakan di dalam blok with
- Dengan dekorator
contextlib.contextmanager, kita bisa membuat implementasi sederhana berbasis fungsi
- Sebelum dan sesudah
yield, kita dapat menjalankan proses setup dan cleanup
# Structural Pattern Matching
- Sintaks
match-case memungkinkan percabangan intuitif untuk struktur data yang kompleks
- Mendukung destructuring tuple/list, pola OR, guard condition (
if), dan wildcard
- Karena percabangan didasarkan pada struktur data, keterbacaan dan kemudahan pemeliharaan meningkat
# Optimasi __slots__
- Mengoptimalkan memori dan kecepatan dengan memakai slot tetap alih-alih
__dict__
__slots__ menggunakan tuple yang hanya berisi nama atribut
- Mencegah penambahan atribut yang tidak perlu ke dalam kelas
- Namun karena ini cenderung optimasi tingkat mikro, penggunaannya perlu dipertimbangkan dengan hati-hati
# Kumpulan tips gaya kode Python
- for-else statement:
else dijalankan bila loop selesai tanpa break
- Walrus operator (
:=): memungkinkan deklarasi variabel dan pengecekan sekaligus
- Short-circuit
or: mengembalikan nilai pertama yang bernilai true di antara beberapa nilai
- Chaining comparison operator: kode bisa dibuat lebih ringkas seperti
0 < x < 10
# Pemformatan lanjutan f-string
- Dengan sintaks
f"{variabel=}", kita bisa membuat representasi untuk debugging
- Tersedia beragam opsi seperti format angka (
:.2f, :+.2f, :,) dan format tanggal (%Y-%m-%d)
- Juga bisa memanfaatkan mini language format untuk perataan tengah, padding, persentase, dan lainnya
# Dekorator cache
@lru_cache dan @cache dapat menyimpan hasil fungsi untuk meningkatkan kecepatan
- Sangat berguna untuk fungsi rekursif atau perhitungan yang sering diulang
@cache diperkenalkan mulai Python 3.9 dan menyediakan cache tak terbatas secara bawaan
# Python Future
- Fitur pemrosesan objek asinkron yang mirip dengan Promise di JS
- Hasil asinkron dapat dikelola lewat
Future.set_result() dan add_done_callback()
asyncio.Future() dapat digunakan bersama await
- Jika dipakai dengan
ThreadPoolExecutor, ini juga memungkinkan pemrosesan paralel di background
# Proxy Property
- Membuat satu atribut kelas dapat bekerja baik sebagai properti maupun sebagai fungsi
- Menyediakan dua fungsi tersebut melalui
__get__, __call__, dan __repr__
- Dalam desain API, ini memungkinkan menangani nilai default dan pemanggilan berparameter dengan satu cara
- Lebih layak dijadikan referensi sebagai contoh eksperimental daripada penggunaan praktis
# Metaclass
- Kelas dari sebuah kelas yang bertugas membuat kelas itu sendiri
- Memungkinkan logika meta seperti memanipulasi atribut kelas atau registrasi otomatis
- Dalam praktiknya, kebanyakan kasus bisa digantikan dengan dekorator
- Framework seperti Django, SQLAlchemy, dan Pydantic menggunakan metaclass secara internal
5 komentar
Dari sudut pandang backend, saya pernah mengalami bahwa metaclass membuat proses debugging menjadi lebih sulit.
Perlu dicatat bahwa
for-elsesering dianggap sebagai anti-pattern karena ada pendapat bahwa fitur ini kurang mudah dibaca atau kurang jelas, danasyncio.Futurediperlakukan sebagai detail implementasi internal dariasyncio.Terima kasih. Khususnya poin 10 akan langsung saya terapkan.
Menambahkan aturan coding AI..
Terima kasih atas tips bermanfaatnya
Opini Hacker News
Halo! Saya penulis asli blog ini! Saya terkejut melihat tulisan saya naik ke halaman depan HN pada pukul 4 pagi
Setiap kali menggunakan Python, saya khawatir apakah kode saya terlihat seperti salah menggunakan Python
Python harus tetap menjadi Python, dan golang, Rust, Typescript masing-masing harus punya filosofi dan desainnya sendiri
Kelebihan terbesar Python adalah rasanya seperti pseudocode yang bisa dijalankan
Catatan tentang evaluasi paragraf 9.3: jika ada string kosong, evaluasinya akan berbeda
Sebagai seseorang yang beralih dari Javascript/Typescript ke Python, ini adalah sumber yang berguna
Sebagian besar fiturnya bukan fitur lanjutan
Hal yang ingin saya ubah dari daftar ini adalah dimasukkannya container
collections.abcSaya menikmati membaca tulisan ini