Apa itu TypeVar
TypeVar, singkatan dari Type Variable, adalah fitur yang kuat dalam modul typing
di Python yang memungkinkan Anda untuk membuat petunjuk tipe yang lebih fleksibel dan dinamis. Ini memungkinkan Anda untuk membuat fungsi dan kelas generik, sehingga memungkinkan penggunaan kode yang sama sambil tetap menjaga keamanan tipe. TypeVar sangat berguna ketika Anda ingin mendefinisikan fungsi atau kelas yang dapat bekerja dengan banyak jenis tetapi masih memaksakan beberapa batasan pada jenis-jenis tersebut.
Untuk membuat TypeVar, Anda harus mengimpornya terlebih dahulu dari modul typing
:
from typing import TypeVar
Kemudian, Anda dapat mendefinisikan TypeVar Anda dengan menyediakan nama unik:
T = TypeVar("T")
Dalam contoh ini, T
mewakili jenis generik yang dapat digantikan oleh jenis lain ketika TypeVar digunakan.
Batasan dan Batasan TypeVar
Saat mendefinisikan TypeVar, Anda dapat menyediakan batasan atau batasan opsional, yang membatasi jenis-jenis yang dapat digantikan untuk TypeVar.
Untuk menetapkan batasan, Anda dapat melewatkan satu atau lebih jenis ke definisi TypeVar:
U = TypeVar("U", int, float)
Dalam contoh ini, U
hanya dapat digantikan oleh int
atau float
.
Untuk menetapkan batas, gunakan argumen bound:
from typing import List
V = TypeVar("V", bound=List)
Di sini, V
dapat menjadi jenis apa pun yang merupakan subclass dari List
.
Petunjuk Tipe untuk Fungsi Generik
Fungsi generik adalah fungsi yang dapat bekerja dengan banyak jenis argumen sambil tetap menjaga keamanan tipe. Untuk membuat fungsi generik, Anda dapat menggunakan TypeVar untuk mewakili jenis-jenis argumen dan nilai kembali dari fungsi.
Mari kita lihat contoh fungsi identitas sederhana:
def identity(x: T) -> T:
return x
Di sini, T
adalah TypeVar yang dapat mewakili jenis apa pun. Fungsi identitas mengambil satu argumen x
dari jenis T
dan mengembalikan nilai dari jenis yang sama T
.
Memanfaatkan TypeVar untuk Batasan Tipe yang Fleksibel
TypeVar dapat digunakan untuk membuat batasan tipe yang lebih kompleks dan fleksibel dalam fungsi generik. Sebagai contoh, pertimbangkan fungsi yang mengambil dua argumen dan mengembalikan jumlahnya. Fungsi ini harus bekerja dengan bilangan bulat dan float, tetapi tidak dengan jenis campuran.
from typing import TypeVar, Union
Number = TypeVar("Number", int, float)
def add(x: Number, y: Number) -> Number:
return x + y
Dalam contoh ini, TypeVar Number
didefinisikan dengan batasan int
dan float
. Fungsi add
mengambil dua argumen dari jenis Number
dan mengembalikan nilai dari jenis yang sama. Ini memastikan bahwa fungsi bekerja dengan bilangan bulat dan float tetapi tidak dengan jenis campuran.
Contoh Praktis Penggunaan TypeVar dalam Fungsi Generik
Mari kita lihat beberapa contoh praktis penggunaan TypeVar dalam fungsi generik.
Fungsi generik untuk mencari indeks item dalam daftar
from typing import List, Optional, TypeVar
T = TypeVar("T")
def find_index(items: List[T], target: T) -> Optional[int]:
for i, item in enumerate(items):
if item == target:
return i
return None
Dalam contoh ini, fungsi find_index
mengambil daftar item dari jenis T
dan item target dari jenis T
yang sama. Fungsi ini mengembalikan indeks item target dalam daftar atau None
jika item tidak ditemukan.
Fungsi generik untuk menggabungkan dua kamus
from typing import Dict, TypeVar
K = TypeVar("K")
V = TypeVar("V")
def merge_dicts(dict1: Dict[K, V], dict2: Dict[K, V]) -> Dict[K, V]:
result = dict1.copy()
result.update(dict2)
return result
Dalam contoh ini, fungsi merge_dicts
mengambil dua kamus dengan kunci dari jenis K
dan nilai dari jenis V
. Fungsi ini mengembalikan kamus baru yang berisi pasangan kunci-nilai yang digabungkan dari kedua kamus input.
Referensi