Get started learning Python with DataCamp's free Intro to Python tutorial. Learn Data Science by completing interactive coding challenges and watching videos by expert instructors. Start Now!
This site is generously supported by DataCamp. DataCamp offers online interactive Python Tutorials for Data Science. Join 11 million other learners and get started learning Python for data science today!
Good news! You can save 25% off your Datacamp annual subscription with the code LEARNPYTHON23ALE25 - Click here to redeem your discount
Modul dan Paket
Dalam pemrograman, modul adalah bagian dari perangkat lunak yang memiliki fungsi tertentu. Misalnya, ketika membangun game ping pong, satu modul mungkin bertanggung jawab atas logika permainan, dan modul lainnya menggambar permainan di layar. Setiap modul terdiri dari file yang berbeda, yang dapat diedit secara terpisah.
Menulis modul
Modul dalam Python hanyalah file Python dengan ekstensi .py. Nama modul sama dengan nama file. Sebuah modul Python dapat memiliki kumpulan fungsi, kelas, atau variabel yang didefinisikan dan diimplementasikan. Contoh di atas mencakup dua file:
mygame/
-
mygame/game.py
-
mygame/draw.py
Script Python game.py
mengimplementasikan permainan. Script ini menggunakan fungsi draw_game
dari file draw.py
,
atau dengan kata lain, modul draw
yang mengimplementasikan logika untuk menggambar permainan di layar.
Modul diimpor dari modul lain menggunakan perintah import
. Dalam contoh ini, script game.py
mungkin
terlihat seperti ini:
# game.py
# import modul draw
import draw
def play_game():
...
def main():
result = play_game()
draw.draw_game(result)
# ini berarti jika skrip ini dieksekusi, maka
# main() akan dieksekusi
if __name__ == '__main__':
main()
Modul draw
mungkin terlihat seperti ini:
# draw.py
def draw_game():
...
def clear_screen(screen):
...
Dalam contoh ini, modul game
mengimpor modul draw
, yang memungkinkannya untuk menggunakan fungsi yang diimplementasikan
dalam modul tersebut. Fungsi main
menggunakan fungsi lokal play_game
untuk menjalankan permainan, dan kemudian
menggambar hasil permainan menggunakan fungsi yang diimplementasikan dalam modul draw
bernama draw_game
. Untuk menggunakan
fungsi draw_game
dari modul draw
, kita perlu menentukan di modul mana fungsi tersebut diimplementasikan, menggunakan operator titik. Untuk merujuk fungsi draw_game
dari modul game
,
kita perlu mengimpor modul draw
dan kemudian memanggil draw.draw_game()
.
Ketika direktif import draw
dijalankan, interpreter Python mencari file dalam direktori tempat skrip dieksekusi dengan nama modul dan akhiran .py
. Dalam kasus ini, interpreter akan mencari draw.py
. Jika ditemukan, modul akan diimpor. Jika tidak ditemukan, pencarian berlanjut untuk modul bawaan.
Anda mungkin memperhatikan bahwa saat mengimpor modul, file .pyc
dibuat. Ini adalah file Python yang telah dikompilasi.
Python mengompilasi file ke dalam bytecode Python agar tidak perlu mengurai file setiap kali modul dimuat. Jika file .pyc
ada, file tersebut akan dimuat sebagai pengganti file .py
. Proses ini transparan bagi pengguna.
Mengimpor objek modul ke dalam namespace saat ini
Namespace adalah sistem di mana setiap objek diberi nama dan dapat diakses di Python. Kita mengimpor fungsi draw_game
ke dalam namespace skrip utama menggunakan perintah from
.
# game.py
# impor modul draw
from draw import draw_game
def main():
result = play_game()
draw_game(result)
Anda mungkin memperhatikan dalam contoh ini bahwa nama modul tidak mendahului draw_game
, karena kita telah menentukan nama modul menggunakan perintah import
.
Keuntungan dari notasi ini adalah Anda tidak perlu merujuk modul berulang kali. Namun, satu namespace tidak dapat memiliki dua objek dengan nama yang sama, sehingga perintah import
dapat menggantikan objek yang ada di dalam namespace.
Mengimpor semua objek dari suatu modul
Anda dapat menggunakan perintah import *
untuk mengimpor semua objek dalam modul seperti ini:
# game.py
# impor modul draw
from draw import *
def main():
result = play_game()
draw_game(result)
Ini mungkin agak berisiko karena perubahan dalam modul dapat mempengaruhi modul yang mengimpornya, tetapi ini lebih singkat, dan tidak mengharuskan Anda menentukan setiap objek yang ingin diimpor dari modul.
Nama impor kustom
Modul dapat dimuat dengan nama apa pun yang Anda inginkan. Ini berguna saat mengimpor modul secara kondisional untuk menggunakan nama yang sama dalam kode lainnya.
Misalnya, jika Anda memiliki dua modul draw
dengan nama yang sedikit berbeda, Anda dapat melakukan hal berikut:
# game.py
# impor modul draw
if visual_mode:
# dalam mode visual, kita menggambar menggunakan grafik
import draw_visual as draw
else:
# dalam mode tekstual, kita mencetak teks
import draw_textual as draw
def main():
result = play_game()
# ini bisa berupa visual atau tekstual tergantung pada visual_mode
draw.draw_game(result)
Inisialisasi modul
Pertama kali sebuah modul dimuat ke dalam skrip Python yang berjalan, modul tersebut diinisialisasi dengan mengeksekusi kode di dalam modul sekali. Jika modul lain dalam kode Anda mengimpor modul yang sama lagi, modul tersebut tidak akan dimuat ulang, sehingga variabel lokal di dalam modul bertindak sebagai "singleton,” yang berarti mereka diinisialisasi sekali saja.
Anda kemudian dapat menggunakan ini untuk menginisialisasi objek. Misalnya:
# draw.py
def draw_game():
# saat membersihkan layar kita dapat menggunakan objek layar utama yang diinisialisasi dalam modul ini
clear_screen(main_screen)
...
def clear_screen(screen):
...
class Screen():
...
# inisialisasi main_screen sebagai singleton
main_screen = Screen()
Memperluas jalur pemuatan modul
Ada beberapa cara untuk memberi tahu interpreter Python di mana mencari modul, selain dari direktori lokal default dan modul bawaan. Anda dapat menggunakan variabel lingkungan PYTHONPATH
untuk menentukan direktori tambahan untuk mencari modul seperti ini:
PYTHONPATH=/foo python game.py
Ini mengeksekusi game.py
, dan memungkinkan skrip untuk memuat modul dari direktori foo
, serta direktori lokal.
Anda juga dapat menggunakan fungsi sys.path.append
. Eksekusi fungsi ini sebelum menjalankan perintah import
:
sys.path.append("/foo")
Sekarang direktori foo
telah ditambahkan ke daftar jalur tempat modul dicari.
Menjelajahi modul bawaan
Lihat daftar lengkap modul bawaan dalam pustaka standar Python di sini.
Dua fungsi yang sangat penting berguna saat menjelajahi modul di Python - fungsi dir
dan help
.
Untuk mengimpor modul urllib
, yang memungkinkan kita membuat data dari URL, kita mengimpor modul tersebut:
# impor pustaka
import urllib
# gunakan
urllib.urlopen(...)
Kita dapat mencari fungsi mana yang diimplementasikan dalam setiap modul dengan menggunakan fungsi dir
:
>>> import urllib
>>> dir(urllib)
['ContentTooShortError', 'FancyURLopener', 'MAXFTPCACHE', 'URLopener', '__all__', '__builtins__',
'__doc__', '__file__', '__name__', '__package__', '__version__', '_ftperrors', '_get_proxies',
'_get_proxy_settings', '_have_ssl', '_hexdig', '_hextochr', '_hostprog', '_is_unicode', '_localhost',
'_noheaders', '_nportprog', '_passwdprog', '_portprog', '_queryprog', '_safe_map', '_safe_quoters',
'_tagprog', '_thishost', '_typeprog', '_urlopener', '_userprog', '_valueprog', 'addbase', 'addclosehook',
'addinfo', 'addinfourl', 'always_safe', 'basejoin', 'c', 'ftpcache', 'ftperrors', 'ftpwrapper', 'getproxies',
'getproxies_environment', 'getproxies_macosx_sysconf', 'i', 'localhost', 'main', 'noheaders', 'os',
'pathname2url', 'proxy_bypass', 'proxy_bypass_environment', 'proxy_bypass_macosx_sysconf', 'quote',
'quote_plus', 'reporthook', 'socket', 'splitattr', 'splithost', 'splitnport', 'splitpasswd', 'splitport',
'splitquery', 'splittag', 'splittype', 'splituser', 'splitvalue', 'ssl', 'string', 'sys', 'test', 'test1',
'thishost', 'time', 'toBytes', 'unquote', 'unquote_plus', 'unwrap', 'url2pathname', 'urlcleanup', 'urlencode',
'urlopen', 'urlretrieve']
Ketika kita menemukan fungsi dalam modul yang ingin kita gunakan, kita bisa membaca lebih lanjut mengenai fungsi tersebut dengan fungsi help
, menggunakan interpreter Python:
help(urllib.urlopen)
Menulis paket
Paket adalah namespace yang berisi beberapa paket dan modul. Mereka hanya direktori, tetapi dengan persyaratan tertentu.
Setiap paket dalam Python adalah direktori yang HARUS berisi file khusus bernama __init__.py
. File ini, yang bisa kosong, menunjukkan bahwa direktori tempatnya berada adalah paket Python. Dengan cara ini, paket dapat diimpor dengan cara yang sama seperti modul.
Jika kita membuat direktori bernama foo
, yang menandai nama paket, kita kemudian dapat membuat modul di dalam paket tersebut yang disebut bar
. Kemudian kita tambahkan file __init__.py
di dalam direktori foo
.
Untuk menggunakan modul bar
, kita dapat mengimpornya dengan dua cara:
import foo.bar
atau:
from foo import bar
Dalam contoh pertama di atas, kita harus menggunakan prefix foo
setiap kali kita mengakses modul bar
. Dalam contoh kedua, kita tidak perlu, karena kita telah mengimpor modul tersebut ke dalam namespace modul kita.
File __init__.py
juga dapat memutuskan modul mana dalam paket yang diekspor sebagai API, sambil menjaga modul lainnya tetap internal, dengan menimpa variabel __all__
seperti ini:
__init__.py:
__all__ = ["bar"]
Exercise
Dalam latihan ini, cetak daftar yang sudah disortir secara alfabet dari semua fungsi dalam modul re
yang mengandung kata find
.
import re
# Your code goes here
find_members = []
import re
# Your code goes here
find_members = []
for member in dir(re):
if "find" in member:
find_members.append(member)
print(sorted(find_members))
test_object('find_members')
success_msg('Great work!')
This site is generously supported by DataCamp. DataCamp offers online interactive Python Tutorials for Data Science. Join over a million other learners and get started learning Python for data science today!