Jumat, 05 September 2025

__init__.py? Untuk Apa?

Pernah ngga penasaran dengan file __init__.py pada setiap direktori Python yang ada di dalam sebuah projek, padahal kadang mereka kosong?

Ya, file __init__.py memiliki tujuan yang spesifik pada lingkungan projek Python, terutama pada Python dengan versi 3.2 atau sebelumnya. File ini digunakan untuk mengenali paket yang digunakan pada projek python. Sebelum lebih jauh, kayaknya ngga rugi kalo kita kenalan dulu apa yang dimaksud dengan paket (package) pada python.

Tunggu tunggu, jangan bahas package dulu. Kita musti bahas module. Jadi...

Apa itu Module?

Module adalah sekumpulan potongan kode baik itu variabel, konstanta, fungsi ataupun objek lain yang tertuang pada sebuah file dengan ekstensi .py. Praktik terbaik dari module adalah dengan menuliskan komponen-komponen pemrograman yang secara unit memiliki tugas yang spesifik dan terarah. Selanjutnya module dapat di muat pada module lain atau juga bisa dijalankan secara langsung. Pada standar Python, module memiliki sistem penamaan (namespace) yang dapat digunakan untuk memuatnya ke module lain dengan keyword import. Saat module sudah dimuat, kita memiliki akses penuh untuk bisa menggunakan seluruh kode didalamnya. Hal ini memungkinkan kita untuk menggunakan kembali fungsi atau kelas tanpa menuliskan kodenya lagi.

Sebagai pemula, akan lebih mudah jika menganggap bahwa seluruh file yang memiliki syntax python dan ekstensi .py adalah sebuah module

Lantas...

Apa itu Package?

Python package merupakan sebuah pendekatan dalam mengemas module atau submodule yang memiliki kesatuan fungsi baik itu secara sistematis atau secara klasik (classical). Biasanya package akan dikelompokkan menggunakan folder dan akan disematkan berkas __init__.py. Setelah package berhasil di import, dia akan memiliki atribut khusus seperti __path__ yang bertugas menyimpan lokasi package itu berada. Hal tersebut dimaksudkan agar intepreter tau lokasi dari package tersebut.

Terus...

Fungsi dari __init__.py itu apa?

__init__.py adalah sebuah file khusus yang akan dipanggil ketika sebuah package di import. Keberadaan __init__.py penting karena file ini akan memuat apapun yang harus dijalankan tepat sebelum package di muat. Intepreter juga akan menjadikan __init__.py ini sebagai penanda bahwa direktori tersebut adalah sebuah package dan menjadikannya sebuah namespace.

Selanjutnya muncul sebuah pertanyaan, "Kenapa setiap folder harus ada __init__.py?" dan penjelasan secara sederhana adalah "__init__.py dijadikan sebagai penanda bahwa direktori tersebut adalah sebuah package"

Namun, ketika ada teman mempraktikan dalam import sebuah modul tanpa __init__.py dia bisa menggunakan package tanpa ada masalah. Lantas dimana kesalahannya? Padahal, __init__.py bersifat mandatori.

Regular Package vs Namespace Package

Terdapat 2 jenis package pada Python yaitu Regular package dan Namespace Package.

Regular package adalah sebuah package tradisional yang digunakan oleh Python versi 3.2 atau sebelumnya. Regular package ditandai dengan adanya __init__.py pada setiap package dan subpackage-nya. Seluruh bagian dari package terletak pada satu direktori saja. Secara umum, package ini akan digunakan sebagai dasar untuk para pengembang dalam membangun sebuah sistem secara khusus atau custom. Karena secara fisik, package akan diletakkan pada satu hierarki folder yang memudahkan mereka dalam melakukan delivery suatu projek.

Sedangkan namespace package adalah sebuah package yang diperkenalkan pada Python 3.3 atau setelahnya, yang merujuk pada standar pengembangan Python PEP 420 - Implicit Namespace Package . PEP 420 membahas mengenai sudut pandang baru mengenai package. Portions pada sebuah namespace package tidak diharuskan berada pada satu hierarki folder yang sama. Module dan sub-package-nya dapat terletak di berbagai direktori. Saat kita memanggil fungsi import pada sebuah namespace package, maka intepreter akan mencari seluruh direktori yang sudah terdaftar dalam sys.path dan mengkombinasikannya menjadi satu virtual package. Itulah kenapa keberadaan __init__.py tidak lagi sebuah kewajiban. Namespace package sering digunakan pada projek dengan skala cukup besar. Sebagai contoh, dalam sebuah projek terdapat package dengan nama warehouse. Warehouse ini memiliki sub-package diantaranya warehouse.data, warehouste.api, dan warehouse.utils yang dikerjakan oleh masing-masing tim yang berbeda. Setiap sub-package bisa saja dijadikan projek yang berbeda, namun mereka tetap akan menggunakan namespace yang sama yaitu warehouse.

Terus gimana?

Dalam praktiknya kendati kita sudah menggunakan versi Python 3.3 atau diatasnya, jenis package tidak menjadi sebuah concern apabila kita mengerjakan sebuah proyek dengan sekala kecil sampai sedang. Karena menggunakan traditional package tidak menjadikannya sebuah drawbacks dan mengimplementasikan namespace package juga tidak menaikkan performa.  

Pemilihann diantara 2 jenis package ini bergantung pada jenis proyeknya. Umumnya untuk proyek standar, regular package sudah meng-cover kebutuhan. Sedangkan untuk package yang sifatnya terdistribusi maka bisa menggunakan namespace package.

Mungkin itu saja. Tolong dikoreksi ya kalo ada salah.

Cheers! 

Sumber:
https://docs.python.org/3/glossary.html
https://docs.python.org/3/reference/import.html
https://docs.python.org/3/tutorial/modules.html
https://stackoverflow.com/questions/27138864/definition-of-a-module
https://stackoverflow.com/questions/7948494/whats-the-difference-between-a-module-and-package-in-python
https://stackoverflow.com/questions/448271/what-is-init-py-for
https://www.geeksforgeeks.org/python/what-is-__init__-py-file-in-python
https://stackoverflow.com/questions/37139786/is-init-py-not-required-for-packages-in-python-3-3

Tidak ada komentar:

Posting Komentar

Terima kasih telah berkunjung.

__init__.py? Untuk Apa?

Pernah ngga penasaran dengan file __init__.py pada setiap direktori Python yang ada di dalam sebuah projek, padahal kadang mereka kosong?