Mengimpor module adalah langkah mudah; mengenal isinya adalah masalah berikutnya. Standard library Python memuat ratusan module, dan setiap module bisa berisi puluhan function — bagaimana kita tahu nama apa saja yang tersedia tanpa membuka dokumentasi online? Python menyediakan alat bantu introspeksi yang bekerja langsung dari interpreter: function dir() untuk mendaftar nama, attribute __dict__ untuk mengintip isi module, dan help() untuk membaca dokumentasi. Pada Chapter ini kita memakai ketiganya untuk menjelajahi module bawaan maupun module buatan sendiri.

Mendaftar Isi Module dengan dir() #

Function bawaan dir() menerima sebuah module dan mengembalikan daftar seluruh nama di dalamnya. Karena daftar itu panjang dan diawali nama-nama internal, kita saring dulu yang diawali garis bawah:

python
import math

nama_publik = [nama for nama in dir(math) if not nama.startswith("_")]

print("Jumlah nama publik di module math:", len(nama_publik))
print(nama_publik[:10])

Output yang Dihasilkan:

text
Jumlah nama publik di module math: 61
['acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'cbrt', 'ceil', 'comb']

Module math menyimpan 61 nama publik — dari fungsi trigonometri seperti acos hingga pembulatan seperti ceil. Slicing nama_publik[:10] mengambil sepuluh nama pertama saja supaya output tetap pendek; daftar lengkapnya bisa kita cetak kapan saja tanpa slicing. Trik yang sama bekerja pada module buatan sendiri:

python
import konversi_berat

for nama in dir(konversi_berat):
    if not nama.startswith("_"):
        print(nama)

Output yang Dihasilkan:

text
KG_PER_PON
pon_ke_kg

Module konversi_berat berisi konstanta KG_PER_PON dan function pon_ke_kg — persis dua nama yang kita definisikan di dalamnya, ditambah nama internal bergaris bawah yang tersaring keluar. File konversi_berat.py sendiri berisi:

python
KG_PER_PON = 0.5

def pon_ke_kg(pon):
    return pon * KG_PER_PON

Mengintip Namespace dengan dict #

Setiap module menyimpan namanya di sebuah dictionary bernama __dict__ — inilah “ruangan” tempat semua definisi module tinggal. Menengok ke dalamnya memberi pemahaman konkret bahwa module sesungguhnya hanya objek dengan isi berupa pasangan nama dan nilai:

python
import konversi_berat

isi = konversi_berat.__dict__
print("Jumlah total nama di __dict__:", len(isi))
print("KG_PER_PON =", isi["KG_PER_PON"])
print("pon_ke_kg adalah fungsi:", callable(isi["pon_ke_kg"]))

Output yang Dihasilkan:

text
Jumlah total nama di __dict__: 10
KG_PER_PON = 0.5
pon_ke_kg adalah fungsi: True

Dari sepuluh nama di dalamnya, hanya dua yang kita definisikan; sisanya adalah nama internal yang dipasang interpreter — __name__, __file__, __doc__, dan kawan-kawannya — yang otomatis tersedia di setiap module. Mengakses isi["KG_PER_PON"] sama persis dengan menulis konversi_berat.KG_PER_PON: titik hanyalah cara lain untuk membaca dictionary tersebut.

Membaca Dokumentasi dengan help() #

Function help() menampilkan dokumentasi sebuah module, class, atau function langsung di terminal. Dokumentasi ini bersumber dari docstring — string dokumentasi yang dituliskan penulis module, topik yang telah kita bahas pada Chapter Komentar dan Docstring:

python
>>> import math
>>> help(math.remainder)
text
Help on built-in function remainder in module math:

remainder(x, y, /)
    Difference between x and the closest integer multiple of y.

    Return x - n*y where n*y is the closest integer multiple of y.
    In the case where x is exactly halfway between two multiples of
    y, the nearest even value of n is used. The result is always exact.

Kombinasi dir() lalu help() adalah alur kerja yang produktif: dir() mendaftar kandidat nama yang menarik, dan help() menjelaskan cara memakainya. Dokumentasi function buatan sendiri juga muncul di help() begitu kita menuliskan docstring-nya — satu alasan kuat membiasakan menulis docstring sejak dini. Dokumentasi yang buruk atau hilang pun cepat terlihat: bila help() hanya menampilkan sekilas tanpa penjelasan, kita tahu penulis module tidak menuliskan docstring-nya.

Mencari Lokasi Module dengan importlib #

Kadang kita perlu tahu file mana yang sebenarnya dimuat tanpa benar-benar mengimpor module — misalnya saat mencurigai adanya penimpaan module seperti pada Chapter Module Search Path. Module importlib.util menyediakan function find_spec() untuk itu:

python
import importlib.util

spesifikasi = importlib.util.find_spec("konversi_berat")
print("Module ditemukan di:", spesifikasi.origin)

Output yang Dihasilkan:

text
Module ditemukan di: /home/budi/belajar/modul_ku/konversi_berat.py

Jalur lengkap pada output mengikuti komputer tempat program dijalankan — di mesin Anda isinya berbeda, tetapi fungsi find_spec() selalu mengembalikan lokasi file yang akan dimuat bila import dilakukan. Berbeda dengan statement import, find_spec() hanya mencari tanpa menjalankan kode apa pun di dalam module, sehingga aman dipakai untuk inspeksi.

Kini seluruh perangkat dasar kita lengkap: mengimpor, membuat module, mengorganisasi package, dan menjelajahi isi module. Chapter penutup section ini merangkai semuanya ke dalam satu keputusan desain yang paling menentukan kesehatan proyek jangka panjang — bagaimana merancang struktur package.