در قسمت قبل ساخت یک زیرپکیج یا sub package رو با هم انجام دادیم و یاد گرفتیم حالا در این قسمت میخوایم relative import رو یاد بگیریم، اما سوال اصلی اینه که فرق absolute import با relative import چیه؟
دو مدل import داریم به طور کلی که شامل relative import و absolute import میشه
در مدل اول که absolute import هستش ما به دو صورت پکیجها و فانکشنها رو میتونیم ایمپورت کنیم
import demo_reader.compressed.bzipped
مدل اول هستش که با همون اسم باید استفادهاش کنیم یعنی هر جا که بخوایم استفاده کنیم باید به این شکل اونو استفاده کنیم
demo_reader.compressed.bzipped()
مدل دوم که کار کردن باهاش راحتتره ولی وقتی تعداد زیادی فانکشن هم اسم داشته باشیم کار باهاش سخت میشه مدل زیر هستش
from demo_reader.compressed import bzipped
که میتونیم به روش زیر ازش استفاده کنیم
bzipped()
حالا اگر بخوایم حالت سوم که میشه relative import رو بررسی کنیم حالت زیر رو در نظر بگیرید
from ..module import name
اون دو نقطه یعنی دو فولدر یا دو پکیج عقبتر برگرده یعنی نقطه سمت راست میشه والد ماژول فعلی و نقطه بعد میشه والد والد فعلی(معادل پدربزرگ/مادربزرگ)
دو قانون اصلی داریم توی relative import که شامل
from module import name
از relative import نمیتوانیم برای import کردن پکیجهای دیگر که در پکیجمون نیستن استفاده کنیم و فقط از پکیجهایی که در پکیجاصلی هستند استفاده کنیم.
حالا با چیزهایی که یاد گرفتیم بیایم و یکمی روی برنامهای که تا این مرحله روش کار کردیم تغییراتی ایجاد کنیم و نحوه استفاده ازش رو ببینیم
در داخل فولدر demo_reader یک فولدر جدید ایجاد کنید به اسم util و مانند آموزشهای قبلی __init__ رو بسازید و همچنین یک فایل جدید به اسم writer.py بسازید و محتویات زیر رو داخل اون قرار بدید
import sys def main(opener): """ Opens the file and writes the data to it. """ f = opener(sys.argv[1], mode="wt") f.write(" ".join(sys.argv[2:])) f.close()
حالا میتونیم ماژولهای قبلی رو که کدهای تکراری داشت رو حذف کنیم و از فایل util.writer که ایجاد کردیم داخل اونها استفاده کنیم
به فایل bzipped.py بروید و محتویات اون رو ادیت کنید
import bz2 from demo_reader.util import writer opener = bz2.open if __name__ == '__main__': writer.main(opener)
حالا به فایل gzipped.py بروید و محتویات اون رو هم ادیت کنید
import gzip from demo_reader.util import writer opener = gzip.open if __name__ == '__main__': writer.main(opener)
حالا این روشی بود که از absolute import استفاده میکنه اما ما میتونیم از relative import استفاده کنیم که خیلی راحتتر این کارو انجام بدیم
import bz2 from ..util import writer opener = bz2.open if __name__ == '__main__': writer.main(opener)
و فایل gzipped.py هم محتویات زیر رو میگیره
import gzip
from ..util import writer
opener = gzip.open
if __name__ == '__main__':
writer.main(opener)
خلاصه(حوصله نداشتید بخونید)
from . import name from demo_reader.compressed import name
from .. import name from demo_reader import name
from ..util import writer from demo_reader.util import name
سمت چپ حالت relative import هستش و سمت راست حالت absolute import خواهد بود
امیدوارم از این قسمت لذت برده باشید