Traffine I/O

Bahasa Indonesia

2023-03-31

TypeVar di Python

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:

python
from typing import TypeVar

Kemudian, Anda dapat mendefinisikan TypeVar Anda dengan menyediakan nama unik:

python
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:

python
U = TypeVar("U", int, float)

Dalam contoh ini, U hanya dapat digantikan oleh int atau float.

Untuk menetapkan batas, gunakan argumen bound:

python
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:

python
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.

python
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

python
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

python
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

https://docs.python.org/3/library/typing.html#typing.TypeVar
https://dev.to/decorator_factory/typevars-explained-hmo

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!