Dalam banyak situasi, program perlu tahu tipe data sebuah nilai: input pengguna dari input() selalu datang sebagai string, sementara perhitungan membutuhkan angka, dan logika program mungkin berbeda untuk tiap tipe. Python menyediakan dua alat bawaan untuk keperluan tersebut — fungsi type() dan fungsi isinstance(). Chapter ini membahas keduanya, termasuk jebakan halus pada pemeriksaan bool dan int yang sudah kita singgung pada Chapter Boolean.
Fungsi type() #
Fungsi type() mengembalikan class dari sebuah object — informasi yang paling berguna saat memeriksa nilai yang datang dari luar:
print(type(42))
print(type(3.14))
print(type("Budi"))
print(type(True))
print(type(None))Output yang Dihasilkan:
<class 'int'>
<class 'float'>
<class 'str'>
<class 'bool'>
<class 'NoneType'>Hasil <class 'int'> menandakan bahwa nilai 42 adalah instance dari class int. Jika hanya butuh nama tipenya sebagai string, atribut __name__ bisa dipanggil, misalnya type(42).__name__ menghasilkan 'int'. Fungsi type() paling cocok untuk inspeksi — melihat isi program saat debugging — bukan untuk pengambilan keputusan, seperti akan kita lihat alasannya di bagian akhir Chapter ini.
Fungsi isinstance() #
Fungsi isinstance() menjawab pertanyaan yang lebih praktis: “apakah nilai ini merupakan instance dari tipe tersebut?” Hasilnya berupa boolean:
print(isinstance(42, int))
print(isinstance(3.14, float))
print(isinstance("Budi", str))
print(isinstance(True, bool))Output yang Dihasilkan:
True
True
True
TrueKelebihan isinstance() dibanding type(): fungsi ini bisa menerima tuple berisi beberapa tipe sekaligus, dan pemeriksaan berhasil jika nilai cocok dengan salah satunya:
nilai = 3.14
print(isinstance(nilai, (int, float)))
print(isinstance("teks", (int, float)))Output yang Dihasilkan:
True
FalsePada contoh pertama, nilai 3.14 lolos pemeriksaan karena bertipe float yang termasuk dalam tuple (int, float). String "teks" tidak lolos karena bukan angka dari tipe mana pun. Pola ini nanti akan sering muncul pada kondisi if di Section Control Flow.
Jebakan bool dan int #
Ingat dari Chapter Boolean bahwa bool adalah subclass dari int. Konsekuensinya terlihat pada dua fungsi pemeriksaan ini:
print(type(True) is bool)
print(type(True) is int)
print(isinstance(True, int))
print(isinstance(42, bool))Output yang Dihasilkan:
True
False
True
FalseMari kita bedah keempat hasil di atas:
- Baris 1 (
print(type(True) is bool)): menghasilkanTrue— class persis dariTruememangbool. - Baris 2 (
print(type(True) is int)): menghasilkanFalse—type()melihat class persisnya, bukan daftar induknya. - Baris 3 (
print(isinstance(True, int))): menghasilkanTrue—isinstance()mengikuti garis inheritance, danboolturunanint. - Baris 4 (
print(isinstance(42, bool))): menghasilkanFalse— hubungan turunannya tidak berlaku dua arah;intbukan turunanbool.
Implikasi praktisnya nyata: kode yang menerima int akan diam-diam menerima True sebagai angka 1. Jika logika program harus benar-benar membedakan boolean dari angka, type() adalah pemeriksaan yang tepat — kasus langkah di mana ketelitian type() justru dibutuhkan.
Mengapa isinstance() Lebih Disarankan #
Untuk hampir semua penggunaan sehari-hari, isinstance() adalah pilihan utama komunitas Python dengan tiga alasan. Pertama, isinstance() sadar-inheritance: kode kita tetap bekerja untuk tipe turunan, sedangkan type(x) is int menolak subclass dan menutup pintu perluasan. Kedua, dukungan tuple tipe membuat satu panggilan cukup untuk beberapa kemungkinan. Ketiga, isinstance() selaras dengan semangat duck typing Python — memeriksa keanggotaan tipe secukupnya, bukan mengunci identitas persisnya; kita akan bahas semangat ini pada Chapter Dynamic Typing.
Pemeriksaan type() yang ketat simpanlah untuk kasus khusus seperti membedakan bool dari int di atas. Di masa depan, saat program kita perlu kontrak tipe yang lebih kuat, Python juga menyediakan type hints yang diperiksa alat bantu seperti mypy — bahasan lengkapnya menanti pada Section Type Hints dan Static Analysis.