Modul dan import
Satu file sepanjang 500 baris sulit diurus. Modul adalah cara Python memecahnya — dan cara kamu memakai pustaka apa pun.
Intisari
- Setiap file
.pyadalah sebuah modul. Panggil isinya denganimport nama_file(tanpa.py). import mathlalumath.sqrt(9)·from math import sqrtlalusqrt(9).- Hindari
from modul import *— kamu jadi tidak tahu nama mana datang dari mana. if __name__ == "__main__":membuat kode hanya jalan saat file dijalankan langsung, bukan saat diimpor.- Jangan menamai filemu sama dengan modul bawaan (
random.py,json.py) — modul aslinya jadi tertutup.
Memakai modul bawaan
import math
print(math.sqrt(16)) # 4.0
print(math.pi) # 3.141592653589793
print(math.ceil(4.2)) # 5
Tiga bentuk import, dan kapan memakainya:
import math # math.sqrt(16) — paling jelas asal-usulnya
from math import sqrt, pi # sqrt(16) — kalau cuma butuh beberapa
import math as m # m.sqrt(16) — untuk nama yang panjang
from math import * # JANGAN
Kenapa import * dihindari: ia menumpahkan semua nama dari modul itu ke filemu.
Kalau dua modul punya nama fungsi yang sama, yang belakangan diam-diam menimpa yang duluan —
dan pembaca kodemu (termasuk kamu) tidak punya cara tahu sqrt itu datang dari mana.
Modul buatan sendiri
Buat file hitung.py:
"""Kumpulan fungsi hitung sederhana."""
def luas_persegi(sisi):
"""Hitung luas persegi."""
return sisi ** 2
def luas_lingkaran(jari):
"""Hitung luas lingkaran."""
return 3.14159 * jari ** 2
Lalu di file lain, di folder yang sama:
import hitung
print(hitung.luas_persegi(5)) # 25
# atau
from hitung import luas_lingkaran
print(luas_lingkaran(3)) # 28.27431
Tanpa .py saat mengimpor. File hitung.py diimpor sebagai
import hitung. Menulis import hitung.py akan gagal.
if __name__ == "__main__"
Tambahkan kode uji di hitung.py:
def luas_persegi(sisi):
return sisi ** 2
print(luas_persegi(4)) # ← ikut jalan saat file ini diimpor!
Saat file lain menulis import hitung, Python menjalankan seluruh isi file itu —
termasuk print tadi. Solusinya:
def luas_persegi(sisi):
return sisi ** 2
if __name__ == "__main__":
# Hanya jalan kalau file ini dijalankan LANGSUNG:
# python hitung.py
# Tidak jalan saat file ini diimpor dari file lain.
print(luas_persegi(4))
__name__ adalah variabel yang disiapkan Python sendiri. Isinya "__main__"
kalau file itu yang kamu jalankan, atau nama modulnya kalau ia sedang diimpor. Kamu akan melihat
baris ini di hampir semua kode Python — sekarang kamu tahu artinya.
Menata proyek berbilang file
proyek-tugas/
├── main.py # titik masuk: menu dan alur program
├── penyimpanan.py # muat() dan simpan() ke JSON
└── tugas.py # tambah_tugas(), hapus_tugas(), tampilkan()
# main.py
from penyimpanan import muat, simpan
from tugas import tambah_tugas, tampilkan
def main():
daftar = muat()
tampilkan(daftar)
tambah_tugas(daftar, input("Tugas baru: "))
simpan(daftar)
if __name__ == "__main__":
main()
Aturan sederhana pemecahannya: satu file = satu tanggung jawab. Kalau kamu bingung sebuah fungsi harus ditaruh di file mana, biasanya nama filenya yang kurang tepat.
Jebakan: nama file bentrok
# Kamu membuat file bernama random.py, lalu:
import random
print(random.randint(1, 10))
# AttributeError: module 'random' has no attribute 'randint'
Python menemukan filemu lebih dulu daripada modul bawaannya. Hindari menamai file
dengan nama modul yang sudah ada: random, json, math,
string, time, test, email.
Kalau terlanjur, ganti nama filenya dan hapus folder __pycache__ yang terbentuk.
Latihan: pecah proyek daftar tugasmu jadi tiga file seperti struktur di atas.
Pastikan main.py tetap bisa dijalankan dan tidak ada satu pun print
di file selain main.py.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.