کاربرد فایل init در دایرکتوری های پروژه پایتون چیست؟
فایل __init__.py
دایرکتوریها را به پکیجهای پایتون تبدیل می کند. با وجود این فایل در یک دایرکتوری، پایتون میداند که آن دایرکتوری یک پکیج معتبر است و این امکان را میدهد که ماژولهای داخلی آن را فراخوانی کنید. به عنوان مثال، اگر ساختار دایرکتوری شما به صورت زیر باشد:
mydir/spam/__init__.py
mydir/spam/module.py
و دایرکتوری mydir
در مسیر جستوجو (path) شما باشد، میتوانید با استفاده از دستورات زیر به کد موجود در module.py
دسترسی پیدا کنید:
import spam.module
یا
from spam import module
اگر این فایل __init__.py
حذف شود، پایتون دیگر به دنبال ماژولهای جانبی در داخل آن دایرکتوری نخواهد گشت و تلاش برای ایمپورت ماژول ناموفق خواهد بود.
علاوه بر این، __init__.py
میتواند شامل کدهای مختلفی باشد که در سطح پکیج تعریف میشوند. برای مثال، میتوان از آن برای تعیین متغیرهایی که به طور مکرر استفاده میشوند، استفاده کرد. این ویژگی به معنای تسهیل در استفاده از پکیجهاست. به عنوان مثال، اگر در یک پکیج به نام database
از یک sessionmaker
به نام Session
به طور مکرر استفاده شود، میتوان کد زیر را در فایل __init__.py
قرار داد:
import os
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
engine = create_engine(os.environ['DATABASE_URL'])
Session = sessionmaker(bind=engine)
حالا میتوان به سادگی از Session
استفاده کرد:
from database import Session
session = Session()
این کار نسبت به تعریف Session
در فایلهای جداگانه، مانند create_session.py
درون پکیج، راحتتر است. بنابراین، __init__.py
نه تنها پکیج را مشخص میکند، بلکه پیادهسازی کدهایی که استفاده مکرری دارند را نیز تسهیل میکند.
در ورژنهای جدید پایتون، از جمله پایتون 3.3 به بعد، وجود __init__.py
برای مشخص کردن پکیجهای namespace الزامی نیست. به همین دلیل، دایرکتوریهایی که این فایل را ندارند، از نظر پایتون به عنوان پکیج شناسایی نمیشوند. این قابلیت باعث تسهیل در پیادهسازی ساختارهای بزرگتر و مدیریت نامها میشود. برای جلوگیری از شلوغ شدن namespace، میتوان از ویژگی __all__
استفاده کرد تا تنها بخشی از محتویات با import *
وارد شوند.
دلایل کلی برای استفاده از __init__.py
به این شکل جمعبندی میشود:
- مشخص کردن دایرکتوریها به عنوان پکیج (در نسخه های قبل تر از 3.3)
- تعریف متغیرهای سطح پکیج.
- مدیریت دقیقتر import ها و جلوگیری از شلوغ شدن namespace.
- امکان استفاده از نرمافزارهای جانبی و ابزارها به صورت سادهتر.