25. Module dan import

Setiap skrip yang kamu tulis selama ini ada dalam satu file. Program nyata berkembang melampaui itu. Python memisahkan program ke beberapa file menggunakan module: sebuah module adalah file .py yang mengekspos function (dan variable) untuk digunakan file lain.

Module hanyalah file Python

Tidak perlu pembungkus khusus. Buat file, taruh function di dalamnya, dan ia sudah menjadi module:

# file: greet.py

def hello(name):
    print(f"Hello, {name}!")

def bye(name):
    print(f"Goodbye, {name}.")

Dua hal yang perlu diperhatikan:

  • File tidak melakukan pekerjaan saat diimport. Tidak ada yang dicetak, tidak ada yang dijalankan. Ia hanya mendefinisikan function.
  • Tidak ada statement return, tidak ada tabel pembungkus, tidak ada upacara. File .py adalah module karena keberadaannya.

Menggunakan module dengan import

File lain memuatnya dengan import:

# file: main.py
import greet

greet.hello("Keiko")
greet.bye("Keiko")

import greet melakukan tiga hal:

  1. Menemukan file bernama greet.py pada path Python.
  2. Menjalankannya (hanya pertama kali — lihat catatan di bawah).
  3. Mengikat nama greet di file saat ini sehingga kamu bisa mengakses isinya via greet.hello, greet.bye, dll.

Python menyimpan cache module yang diimport. Jika dua file keduanya import greet, Python memuat greet.py sekali dan kedua file berbagi objek module yang sama. Ini bagus — artinya module murah untuk diimport dari mana saja.

from module import name

Jika kamu hanya butuh satu atau dua nama dari sebuah module, import langsung:

from greet import hello

hello("Keiko")   # no "greet." prefix needed

Untuk mengimport beberapa nama sekaligus:

from greet import hello, bye

Ini menempatkan hello dan bye langsung ke namespace saat ini. Tidak diperlukan awalan greet., tapi juga tidak ada greet. yang memberitahu pembaca dari mana function-function ini berasal. Untuk function kecil yang namanya jelas, tidak masalah; untuk module besar, import greet dan menggunakan greet.hello lebih jelas.

import module as alias

Nama module yang panjang bisa diberi alias yang lebih pendek:

import math_helpers as mh

print(mh.double(7))
print(mh.triple(7))

Ini umum di ekosistem Python — kamu akan melihat import numpy as np dan import pandas as pd di mana-mana. Untuk module kecilmu sendiri, alias bersifat opsional.

Di mana Python mencari

Python mencari di direktori kerja saat ini terlebih dahulu, lalu daftar path library standar dan paket yang terinstal. Layout paling sederhana adalah menaruh main.py dan greet.py di folder yang sama, lalu jalankan dari folder itu:

cd exercises/25/examples
python main.py

Jika kamu berada di root repo dan menjalankan python exercises/25/examples/main.py, Python mungkin tidak menemukan greet.py karena pencariannya dimulai dari direktori skrip. Jalankan dari folder yang sama untuk membuatnya sederhana.

Helper privat di dalam module

Function yang tidak ingin kamu panggil dari file lain bisa dibiarkan sebagai function biasa — cukup jangan sebutkan di dokumentasi module atau ekspos via from module import *. Konvensinya adalah mengawali namanya dengan underscore:

# file: math_helpers.py

def _clamp(x, lo, hi):
    if x < lo:
        return lo
    if x > hi:
        return hi
    return x

def double(x):
    return _clamp(x * 2, -100, 100)

_clamp dimulai dengan _, yang menandakan "hanya untuk penggunaan internal". File lain bisa memanggil math_helpers._clamp jika mereka mau, tapi underscore adalah konvensi kuat yang mengatakan jangan dilakukan.

Pekerjaan Rumah

Pekerjaan rumah Part 5 menggunakan dua file per soal: sebuah file module dan main.py yang menggunakannya. Setiap soal ada di sub-foldernya sendiri agar dua file itu berada bersama. Buka terminal, cd ke folder itu, lalu jalankan python main.py.

Soal 1 — Module greet

Folder: exercises/25/homework/01-greet-module/.

Lengkapi greet.py agar mengekspos hello(name) dan bye(name). File main.py sudah disediakan dan sudah memanggil kedua function tersebut.

Soal 2 — Math helpers

Folder: exercises/25/homework/02-math-helpers/.

Bangun module math_helpers.py dengan setidaknya dua function:

  • double(x) mengembalikan x * 2.
  • triple(x) mengembalikan x * 3.

main.py memanggil keduanya dan mencetak hasilnya.

Soal 3 — Counter

Folder: exercises/25/homework/03-counter/.

Bangun module counter.py yang mengekspos tiga function:

  • increment() — menambah counter sebesar 1.
  • get() — mengembalikan nilai saat ini.
  • reset() — mengatur counter kembali ke 0.

Counter itu sendiri adalah variable di level module di dalam counter.py. Ia harus bertahan antar pemanggilan (ingat kembali diskusi scope di akhir Bab 21).

Tantangan — String utilities

Folder: exercises/25/homework/04-string-utils/.

Bangun module string_utils.py dengan setidaknya tiga function buatanmu sendiri. Saran:

  • shout(s) mengembalikan s dalam huruf kapital dengan ! di belakang.
  • echo(s, n) mengembalikan s yang diulang n kali dengan spasi di antara.
  • reverse_words(s) mengembalikan kata-kata dari s dalam urutan terbalik.

Yang terakhir adalah tantangan lebih — kamu perlu memisahkan string menjadi kata-kata dan membalik list-nya. Jika itu terlalu banyak, ganti dengan yang lain buatanmu sendiri.

Bingung atau sudah selesai? Buka halaman solusi pekerjaan rumah.