Apa itu TypedDict
TypedDict adalah fitur yang diperkenalkan dalam Python 3.8, sebagai bagian dari modul typing. Fitur ini memungkinkan Anda untuk menentukan petunjuk tipe untuk kamus, di mana Anda dapat menandai kunci yang diharapkan dan tipe nilai yang sesuai. TypedDict tidak mengenakan tipe-tipe ini saat runtime; sebaliknya, fitur ini digunakan untuk alat pengecekan tipe statis, meningkatkan keterbacaan dan keberlanjutan kode Anda.
Membuat TypedDict
Membuat TypedDict di Python sangatlah mudah. Pertama, Anda perlu mengimpor kelas TypedDict
dari modul typing
. Kemudian, Anda mendefinisikan TypedDict Anda sebagai kelas baru yang mewarisi dari TypedDict
. Di dalam kelas ini, Anda mendefinisikan kunci-kunci dan tipe yang terkait.
Mari buat sebuah TypedDict sederhana untuk profil pengguna:
from typing import TypedDict
class UserProfile(TypedDict):
name: str
age: int
email: str
Dalam contoh di atas, kita telah membuat TypedDict dengan nama UserProfile
. Menurut definisinya, sebuah kamus dengan tipe UserProfile
harus memiliki kunci-kunci name
, age
, dan email
, dengan tipe masing-masingnya adalah str
, int
, dan str
.
Sekarang setelah kita mendefinisikan TypedDict UserProfile kita, mari kita lihat bagaimana menggunakannya:
def display_user(profile: UserProfile) -> None:
print(f"Name: {profile['name']}")
print(f"Age: {profile['age']}")
print(f"Email: {profile['email']}")
user: UserProfile = {
'name': 'Alice',
'age': 30,
'email': 'alice@example.com'
}
display_user(user)
Pada kode di atas, kita pertama-tama mendefinisikan fungsi display_user
yang mengambil sebuah kamus UserProfile
sebagai argumen dan mencetak informasi pengguna. Kemudian, kita membuat sebuah kamus pengguna sesuai dengan TypedDict UserProfile
yang kita definisikan sebelumnya, dan memanggil display_user
dengan user sebagai argumen.
Petunjuk tipe pada tanda tangan fungsi membantu memastikan bahwa fungsi display_user
selalu menerima tipe kamus yang benar. Jika kita mencoba memanggil display_user
dengan kamus yang tidak sesuai dengan TypedDict UserProfile
(misalnya jika terdapat kunci yang hilang atau kunci memiliki nilai dengan tipe yang salah), kita akan mendapatkan galat tipe.
Kunci Opsional dalam TypedDict
Sementara TypedDict yang kita buat pada bagian sebelumnya memerlukan semua kunci untuk hadir dan memiliki tipe tertentu, adalah juga mungkin untuk mendefinisikan TypedDict dengan kunci opsional. Hal ini dapat dilakukan dengan menggunakan parameter total
dalam definisi TypedDict.
Misalkan dalam profil pengguna, alamat surel bersifat opsional. Hal ini dapat kita representasikan dengan mengatur total=False
dalam definisi UserProfile
kita:
from typing import TypedDict
class UserProfile(TypedDict, total=False):
name: str
age: int
email: str
Sekarang, sebuah UserProfile
dapat memiliki kunci email
atau tidak, dan tetap valid:
def display_user(profile: UserProfile) -> None:
print(f"Name: {profile['name']}")
print(f"Age: {profile['age']}")
if 'email' in profile:
print(f"Email: {profile['email']}")
user: UserProfile = {
'name': 'Alice',
'age': 30
}
display_user(user)
Pada contoh kode di atas, kita telah memodifikasi fungsi display_user
untuk hanya mencetak alamat surel jika ada dalam profil. Kemudian, kita membuat kamus user
tanpa alamat surel, dan display_user(user)
berjalan tanpa adanya galat.
TypedDict Bersarang
TypedDict juga dapat bersarang untuk mewakili struktur data yang lebih kompleks. Misalkan terdapat skenario di mana profil pengguna mencakup alamat, yang pada dirinya sendiri merupakan kamus dengan beberapa bidang:
from typing import TypedDict
class Address(TypedDict):
street: str
city: str
state: str
zip_code: str
class UserProfile(TypedDict):
name: str
age: int
email: str
address: Address
Pada contoh kode di atas, kita telah mendefinisikan TypedDict Address
, dan kemudian menggunakannya dalam definisi UserProfile
. Sekarang, sebuah UserProfile
mencakup kunci address
, yang nilainya harus berupa kamus Address
.
TypedDict dan Pewarisan
TypedDict juga mendukung pewarisan. Hal ini berguna ketika Anda memiliki beberapa jenis kamus yang memiliki beberapa bidang yang sama namun juga memiliki bidang unik mereka sendiri.
Misalkan terdapat skenario di mana, selain profil pengguna, kita juga memiliki profil admin. Admin memiliki semua bidang yang sama dengan pengguna, tetapi juga memiliki bidang tambahan permissions
:
class AdminProfile(UserProfile):
permissions: list[str]
Pada contoh kode di atas, kita mendefinisikan AdminProfile
sebagai subkelas dari UserProfile
, dan menambahkan bidang permissions
tambahan. Sekarang, sebuah AdminProfile
diharapkan memiliki semua bidang dari UserProfile
, ditambah bidang permissions
.
Referensi