آموزش ساخت پکیج در پایتون و کار با package

پکیج در پایتون مجموعه‌ای از ماژول‌ها است! وقتی تعدادی ماژول را در یک فولدر قرار دهیم اصطلاحاً می‌گوییم یک 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()

به همین سادگی توانستیم یک پکیج ساده با دو ماژول ایجاد کرده و از آن استفاده کنیم.

کار با اکسل در پایتون : خواندن و نوشتن excel با ۳ ماژول

کار با اکسل در پایتون : خواندن و نوشتن excel با ۳ ماژول

کار با پکیج پیشرفته

همهٔ ما فایل‌هایی که در کامپیوتر یا موبایل‌هایمان داریم را در فولدرها و زیرفولدرها دسته‌بندی می‌کنیم. در پکیج بندی پایتون نیز می‌توانیم از ساختار سلسه مراتبی فولدرها کمک بگیریم.

یعنی حتماً نیاز نیست پکیج ما یک فولدر شامل چندین ماژول باشد؛ بلکه هر پکیج می‌تواند زیرپکیج‌هایی نیز داشته باشد. (اصطلاحاً sub-package)

در اینجا چند فایل و پکیج مختلف در کنار کد پایتون خود ایجاد کرده‌ام تا در ادامه نحوه فراخوانی آن‌ها را با هم بررسی کنیم.

نمونه ساختار پکیج تودرتو python
نمونه ساختار یک پکیج پیچیده‌تر در پایتون

دقت کنید که در تمام فولدرها فایل __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")

می‌بینید که تعریف کدهای ماژول‌های پکیج پایتون آزادی زیادی داریم. پس هر زمان که احساس کردید کدهایتان نیاز به ساماندهی بیشتری دارند، می‌توانید از ماژول‌ها و پکیج بندی در پایتون استفاده کنید.

پیشنهاد می‌کنم قبل از رفتن به جلسه بعدی دوره، یک پکیج که حداقل حاوی یک زیرپکیج است برای خودتان ایجاد کنید. سعی کنید این کار را بدون دیدن کدها و ساختارهای بالا انجام دهید. 🙂

اگر علاقه‌مند بودید، می‌توانید کدهای یک نمونه پکیج دیگر را هم در این سایت انگلیسی بررسی کنید.

امیدوارم با نحوه تعریف پکیج در پایتون و استفاده از آن به خوبی آشنا شده باشید. اگر سؤال یا ابهامی در این مورد دارید بخش دیدگاه‌های آموزش برای شماست.

این آموزش بخشی از یک آموزش جامع و قدم به قدم در سبز دانش است: دوره رایگان آموزش پایتون