Fitur Python Tingkat Lanjut
(blog.edward-li.com)- 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, dancontext 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, danwalrus - 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
@overloadmemungkinkan 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
idatauusername Literaldapat 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 649mengusulkan 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 bentukclass 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 pemeriksaanisinstance
# Context Manager
- Objek dengan metode
__enter__dan__exit__yang digunakan di dalam blokwith - 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-casememungkinkan 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:
elsedijalankan bila loop selesai tanpabreak - 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_cachedan@cachedapat menyimpan hasil fungsi untuk meningkatkan kecepatan- Sangat berguna untuk fungsi rekursif atau perhitungan yang sering diulang
@cachediperkenalkan 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()danadd_done_callback() asyncio.Future()dapat digunakan bersamaawait- 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