پکیج در پایتون مجموعهای از ماژولها است! وقتی تعدادی ماژول را در یک فولدر قرار دهیم اصطلاحاً میگوییم یک package یا بسته در پایتون ساختهایم. این کار برای مدیریت بهتر کدها و سازماندهی آنها انجام میشود. در این آموزش با پکیجها و ترفندهای آن آشنا میشویم.
برای اینکه متوجه همهٔ توضیحات این آموزش شوید، بهتر است با ماژولها آشنا باشید.
یک ماژول همان فایل کدهایمان بود که از آن در کدهای دیگر استفاده میکردیم. معمولاً هر ماژول یک هدف خاص را دنبال میکند. این نوع دستهبندی کدها، به ما کمک میکند علاوه بر مدیریت آسان تغییرات، بتوانیم از ماژولهایمان در پروژههای دیگر استفاده کنیم.
پکیج های پایتون
به زبان خیلی ساده، یک پکیج در پایتون (Python Package) تعدادی ماژول است که درون یک فولدر (پوشه) قرار گرفتهاند! معمولاً ماژولهایی که در یک پکیج قرار میگیرند هدف مشابهی دارند. مثلاً بخش مدیریت سطح دسترسی (authentication) یک برنامه یا مدیریت کاربران میتواند یک پکیج باشد.
برای درک بهتر با یک مثال ساده پیش میروم.
فرض کنید دو ماژول برای ورود و خروج کاربران داریم. برای سادگی کدها، هر کدام صرفاً یک تابع برای چاپ پیامی خاص دارند:
# login.py
def do_login():
print("logging in ...")
# logout.py
def do_logout():
print("Logging out ...")
فایلهای login.py
و logout.py
را درون یک فولدر به نام auth قرار میدهم.
ساخت package در پایتون
برای اینکه به پایتون بفهمانیم این فولدر یک فولدر معمولی نیست و یک پکیج است، نیاز به فایلی به نام __init__.py
در کنار این فایلها داریم.
این فایل میتواند خالی باشد و هیچ کدی در آن وجود نداشته باشد. وقتی یک یا چند ماژول از این پکیج را در برنامه خود فراخوانی میکنیم، ابتدا فایل __init__ اجرا میشود و سپس کدهای ماژول در برنامه وارد میشود.
بنابراین ممکن است بنا به نیازتان بخواهید درون این فایل توابع، متغیرها یا کلاس خاصی را تعریف کنید.
فراخوانی پکیج پایتون
حالا یک فایل به نام app.py
در کنار فولدر ایجاد میکنم تا در آن از پکیجی که ساختیم استفاده کنم؛ بنابراین ساختار فایلهای من تا الآن چیزی شبیه به درخت زیر شده است:
مشابه فراخوانی ماژولها، با دستور import میتوانیم ماژولهای پکیج را صدا زده و استفاده کنیم. نام فولدر پکیج در ابتدا و سپس نام ماژول قرار میگیرد. این دو با علامت نقطه (.
) جدا میشوند.
# app.py
import auth.login
auth.login.do_login()
در قطعه کد زیر از دستور from … import برای استفاده از یک یا چند ماژول استفاده کردهام:
from auth import login, logout
login.do_login()
logout.do_logout()
به همین سادگی توانستیم یک پکیج ساده با دو ماژول ایجاد کرده و از آن استفاده کنیم.
کار با پکیج پیشرفته
همهٔ ما فایلهایی که در کامپیوتر یا موبایلهایمان داریم را در فولدرها و زیرفولدرها دستهبندی میکنیم. در پکیج بندی پایتون نیز میتوانیم از ساختار سلسه مراتبی فولدرها کمک بگیریم.
یعنی حتماً نیاز نیست پکیج ما یک فولدر شامل چندین ماژول باشد؛ بلکه هر پکیج میتواند زیرپکیجهایی نیز داشته باشد. (اصطلاحاً sub-package)
در اینجا چند فایل و پکیج مختلف در کنار کد پایتون خود ایجاد کردهام تا در ادامه نحوه فراخوانی آنها را با هم بررسی کنیم.
دقت کنید که در تمام فولدرها فایل __init__.py
را ایجاد میکنیم.
مشابه چیزی که تا الآن داشتیم، میتوانیم مستقیماً پکیجها را در برنامه import کنیم:
import app.auth.login
# usage:
app.auth.login.do_login()
برای سادهتر شدن استفاده از توابع، کلاسها و متغیرهای درون هر ماژول (متغیر پایتون)، شاید بهتر باشد از ساختار from import استفاده کنیم.
اینطوری زمان صدا زدن توابع فقط کافی است اسم ماژول را در ابتدای آن قرار دهیم:
from app.auth import login
login.do_login()
اگر میخواهید فقط از یک تابع، کلاس یا متغیر درون ماژول استفاده کنید، import مستقیم همان یک مورد نیز روش مناسبی است.
from app.auth.login import do_login
do_login()
پیشنهاد میکنم از این حالت فقط زمانی استفاده کنید که قرار است یکی دو مورد را از پکیج import کنید. در صورتیکه تعداد زیادی را با namespace کامل (همین حالتی که بدون نوشتن نام پکیج است) وارد برنامه کنید، پیچیدگی کدتان زیاد خواهد شد.
کار با ماژولها در بسته پایتون
احتمالاً تا الآن حدس زده باشید که میتوانیم از alias برای ماژول یا مواردی که ایمپورت میکنیم نیز استفاده کنیم. مثلاً در قطعه کد زیر، ماژول login از پکیج app.auth
را با نام مستعار lgn در کد پایتون خود فراخوانی کردهام:
from app.auth import login as lgn
lgn.do_login()
البته بهتر است از اسامی مخففی که به سختی متوجه معنی آنها میشویم کمتر استفاده کنیم. مثلاً اینجا lgn فقط برای آموزش بود و در پروژه واقعی بهتر است استفاده نشود.
اگر خاطرتان باشد، ماژول utils که در جلسه قبلی ایجاد کرده بودیم، علاوه بر یک تابع، حاوی یک کلاس و یک لیست از نامها بود.
در قطعه کد زیر این ماژول از پکیج app.tools
خودم را فراخوانی کرده و لیست و کلاس را استفاده میکنم.
from app.tools import utils
print(utils.sample_names)
p1 = utils.Person("Omid Rajaei")
میبینید که تعریف کدهای ماژولهای پکیج پایتون آزادی زیادی داریم. پس هر زمان که احساس کردید کدهایتان نیاز به ساماندهی بیشتری دارند، میتوانید از ماژولها و پکیج بندی در پایتون استفاده کنید.
پیشنهاد میکنم قبل از رفتن به جلسه بعدی دوره، یک پکیج که حداقل حاوی یک زیرپکیج است برای خودتان ایجاد کنید. سعی کنید این کار را بدون دیدن کدها و ساختارهای بالا انجام دهید. 🙂
امیدوارم با نحوه تعریف پکیج در پایتون و استفاده از آن به خوبی آشنا شده باشید. اگر سؤال یا ابهامی در این مورد دارید بخش دیدگاههای آموزش برای شماست.