5 poin oleh GN⁺ 2024-10-14 | 2 komentar | Bagikan ke WhatsApp
  • 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

 
ilotoki0804 2024-10-15

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 dataclass atau NamedTuple yang terstruktur.

 
GN⁺ 2024-10-14
Komentar Hacker News
  • Orang-orang yang lebih menyukai tipe dinamis makin menyadari pentingnya sistem tipe

    • Sistem tipe yang lebih baik lebih unggul daripada sistem tipe yang lebih buruk
  • Alasan menggunakan dataclass(slots=True) alih-alih TypedDict

    • Akses atribut lebih cepat sehingga kode berjalan lebih cepat
    • Kelas slot menggunakan RAM lebih sedikit dan memberi tekanan lebih kecil pada cache L1, sehingga kode berjalan lebih cepat
    • Saat mengakses atribut, menggunakan .foobar alih-alih ["foobar"] lebih nyaman bagi pergelangan tangan
    • Jika salah mengetik nama atribut, akan muncul error saat runtime
  • Tanpa sistem yang menegakkan tipe, TypedDict tidak berperan apa pun

    • Meski menyimpan nilai yang keliru pada properti yang dianotasi sebagai string, Python bawaan tidak akan mencegah atau memperingatkannya
    • Untuk benar-benar menegakkan tipe, perlu memakai alat seperti Pydantic
  • Judul "thank you think" terdengar terlalu kasar

    • "than i thought" terasa lebih enak dibaca
  • Makna "None" dalam kalimat terkait subskrip tidak jelas

    • Tata bahasanya rumit sehingga sulit dipahami
  • Pengalaman pribadi dengan TypedDict

    • Menggunakan TypedDict untuk memberi anotasi pada dict demi meningkatkan keterbacaan kode
    • Bisa mengurangi waktu yang dihabiskan untuk melacak alur kode
    • Memerlukan kemampuan coding yang lebih baik, tetapi merupakan solusi yang bagus untuk aplikasi yang banyak memakai dict
  • Fitur TypedDict bagus, tetapi sintaks deklarasinya rumit