TypedDict diperkenalkan dalam PEP-589 dan dihadirkan di Python 3.8. Utamanya digunakan untuk membuat anotasi tipe pada dictionary.
- Alih-alih menggunakan
dataclass atau pydantic untuk merepresentasikan data bertipe 'record', TypedDict memanfaatkan fleksibilitas dictionary sehingga menguntungkan dalam situasi ketika field bisa saja tidak ada.
- Sebagai contoh, mendefinisikan kelas
Movie dan menetapkan dictionary bertipe Movie ke variabel movie
class Movie(TypedDict):
title: str
movie: Movie = {"title": "Avatar"}
Non-totality
TypedDict mendukung non-totality, yaitu konsep yang menunjukkan bahwa field dapat tidak ada. Ini berguna saat mengimplementasikan endpoint HTTP PATCH
dataclass bisa terasa canggung karena tidak memiliki konsep field yang hilang
- Dalam
TypedDict, field yang hilang dapat ditangani secara fleksibel dengan menetapkan total=False
- PEP-655 memungkinkan penandaan tiap field secara individual dengan
Required dan NotRequired
Menggunakan TypedDict sebagai **kwargs
- PEP-692 memungkinkan penggunaan
TypedDict untuk memasukkan argumen kata kunci variadik
- Menggunakan
TypedDict bisa membuat kode terlihat bertele-tele, tetapi berguna jika dipakai ulang di beberapa definisi fungsi
- Jika digunakan bersama non-totality, kelebihannya makin terasa
- Misalnya saat mengustomisasi
pytest.fixture sambil meneruskan sebagian argumen apa adanya
- Perilaku serupa bisa diimplementasikan dengan nilai sentinel, tetapi anotasi tipenya bisa menjadi canggung
Menggunakan TypedDict untuk dependency injection
- PEP-692 memungkinkan pemeriksaan tipe saat memanggil fungsi yang menggunakan
TypedDict
- Berguna ketika banyak resource berbagi sebagian dependensi yang sama
- Definisikan
TypedDict yang mirip dengan gabungan kwargs dari semua resource
- Setelah resource ditulis ulang agar menerima argumen arbitrer, lakukan dependency injection dengan
TypedDict
- Melalui sistem tipe, kesalahan atau argumen yang hilang saat dependency injection dapat diperiksa
- Mengubah signature resource memang tidak ideal, tetapi tetap perubahan yang lebih kecil dibanding menggunakan framework dependency injection
- Banyak framework tidak mendukung pemeriksaan tipe statis
Fitur mendatang
- PEP-728 memungkinkan pendefinisian tipe untuk item tambahan, serta pendefinisian dictionary tertutup yang tidak mengizinkan item tambahan
- Membantu mendefinisikan tipe record dengan lebih akurat
- PEP-705 memungkinkan penandaan item sebagai read-only (tergantung waktu publikasi, mungkin sudah dirilis)
- Menangani situasi ketika potensi mutasi (penghapusan) dapat menimbulkan masalah di antara
TypedDict lain yang secara intuitif seharusnya kompatibel
Ringkasan GN⁺
TypedDict menguntungkan dalam situasi ketika field bisa saja tidak ada, karena memanfaatkan fleksibilitas dictionary.
TypedDict menawarkan opsi yang lebih fleksibel dibanding struktur data lain seperti dataclass atau pydantic.
- Pilih alat yang sesuai dengan domain, tetapi tetap ingat kelebihan
TypedDict
2 komentar
Jika data sering datang dari luar dalam bentuk JSON atau sering diekspor ke luar Python, menggunakan TypedDict adalah pilihan yang baik; jika tidak, saya merekomendasikan menggunakan
dataclassatauNamedTupleyang terstruktur.Komentar Hacker News
Orang-orang yang lebih menyukai tipe dinamis makin menyadari pentingnya sistem tipe
Alasan menggunakan
dataclass(slots=True)alih-alihTypedDict.foobaralih-alih["foobar"]lebih nyaman bagi pergelangan tanganTanpa sistem yang menegakkan tipe,
TypedDicttidak berperan apa punPydanticJudul "thank you think" terdengar terlalu kasar
Makna "None" dalam kalimat terkait subskrip tidak jelas
Pengalaman pribadi dengan
TypedDictTypedDictuntuk memberi anotasi pada dict demi meningkatkan keterbacaan kodeFitur
TypedDictbagus, tetapi sintaks deklarasinya rumit