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:

python
print(type(42))
print(type(3.14))
print(type("Budi"))
print(type(True))
print(type(None))

Output yang Dihasilkan:

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

python
print(isinstance(42, int))
print(isinstance(3.14, float))
print(isinstance("Budi", str))
print(isinstance(True, bool))

Output yang Dihasilkan:

text
True
True
True
True

Kelebihan isinstance() dibanding type(): fungsi ini bisa menerima tuple berisi beberapa tipe sekaligus, dan pemeriksaan berhasil jika nilai cocok dengan salah satunya:

python
nilai = 3.14
print(isinstance(nilai, (int, float)))
print(isinstance("teks", (int, float)))

Output yang Dihasilkan:

text
True
False

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

python
print(type(True) is bool)
print(type(True) is int)
print(isinstance(True, int))
print(isinstance(42, bool))

Output yang Dihasilkan:

text
True
False
True
False

Mari kita bedah keempat hasil di atas:

  1. Baris 1 (print(type(True) is bool)): menghasilkan True — class persis dari True memang bool.
  2. Baris 2 (print(type(True) is int)): menghasilkan False — type() melihat class persisnya, bukan daftar induknya.
  3. Baris 3 (print(isinstance(True, int))): menghasilkan True — isinstance() mengikuti garis inheritance, dan bool turunan int.
  4. Baris 4 (print(isinstance(42, bool))): menghasilkan False — hubungan turunannya tidak berlaku dua arah; int bukan turunan bool.

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.