بستهها روشی برای ساختاردهی فضای نام ماژولهای پایتون با استفاده از "نامهای ماژول نقطهدار" هستند. برای مثال، نام ماژول A.B یک ماژول فرعی به نام B در بستهای به نام A را مشخص میکند.
فرض کنید میخواهید مجموعهای از ماژولها (یک "بسته") برای مدیریت یکنواخت فایلهای صوتی و دادههای صوتی طراحی کنید. در اینجا ساختار ممکن بسته شما آورده شده است:
sound/ بسته سطح بالا
__init__.py مقداردهی اولیه بسته sound
formats/ زیربسته برای تبدیل قالب فایل
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/ زیربسته برای افکتهای صوتی
__init__.py
echo.py
surround.py
reverse.py
...
filters/ زیربسته برای فیلترها
__init__.py
equalizer.py
vocoder.py
karaoke.py
...
فایلهای __init__.py برای اینکه پایتون پوشههای حاوی فایل را به عنوان بسته بشناسد ضروری هستند. در سادهترین حالت، __init__.py فقط میتواند یک فایل خالی باشد.
کاربران بسته میتوانند ماژولهای منفردی از بسته را وارد کنند. به عنوان مثال:
import sound.effects.echo
این ماژول فرعی sound.effects.echo را بارگذاری میکند و باید با نام کاملش ارجاع داده شود:
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
روش جایگزین:
from sound.effects import echo echo.echofilter(input, output, delay=0.7, atten=4)
یا وارد کردن مستقیم تابع یا متغیر مورد نظر:
from sound.effects.echo import echofilter echofilter(input, output, delay=0.7, atten=4)
توجه کنید که وقتی از from package import item استفاده میکنید، item میتواند یک ماژول فرعی (یا زیربسته) بسته باشد، یا نام دیگری که در بسته تعریف شده مانند تابع، کلاس یا متغیر.
در مقابل، وقتی از نحو import item.subitem.subsubitem استفاده میکنید، هر item به جز آخری باید یک بسته باشد؛ آخرین item میتواند ماژول یا بسته باشد.
وقتی کاربر from sound.effects import * مینویسد، راه حل این است که نویسنده بسته یک فهرست صریح از بسته فراهم کند. دستور import از این قرارداد پیروی میکند: اگر کد __init__.py یک بسته لیستی به نام __all__ تعریف کند، آن به عنوان لیست نام ماژولهایی که باید import شوند در نظر گرفته میشود. به عنوان مثال:
__all__ = ["echo", "surround", "reverse"]
این بدان معناست که from sound.effects import * سه ماژول فرعی نام برده شده را وارد میکند.
اگر __all__ تعریف نشده باشد، from sound.effects import * تمام ماژولهای فرعی را وارد نمیکند؛ فقط تضمین میکند که بسته sound.effects import شده باشد و سپس نامهای تعریف شده در بسته را وارد میکند.
وقتی بستهها به زیربستهها ساختاردهی شده باشند، میتوانید از import مطلق برای ارجاع به ماژولهای فرعی بستههای خواهر استفاده کنید. برای مثال:
from sound.effects import echo
همچنین میتوانید import نسبی بنویسید. این importها از نقاط ابتدایی برای نشان دادن بستههای جاری و والد استفاده میکنند. از ماژول surround میتوانید از این نحو استفاده کنید:
from . import echo from .. import formats from ..filters import equalizer
توجه کنید که importهای نسبی بر اساس نام بسته ماژول جاری هستند. از آنجا که ماژون اصلی بسته ندارد، ماژولهایی که برای استفاده به عنوان ماژول اصلی یک برنامه پایتون در نظر گرفته شدهاند باید همیشه از import مطلق استفاده کنند.
بستهها یک ویژگی خاص دیگر نیز پشتیبانی میکنند: __path__. این به طور پیشفرض توالیای از رشتهها حاوی نام پوشه حاوی __init__.py بسته قبل از اجرای کد در آن فایل است. این متغیر میتواند تغییر کند و تأثیری در جستجوهای آتی برای ماژولها و زیربستههای موجود در بسته دارد.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://docs.python.org/3/tutorial