Pooya Dowlat Abadi
Pooya Dowlat Abadi
خواندن ۳ دقیقه·۳ سال پیش

برنامه‌های سازمان‌ یافته‌تر در پایتون - relative import - قسمت پنجم

در قسمت قبل ساخت یک زیرپکیج یا 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 که شامل

  1. برعکس حالت اول مدل absolute نمی‌تونیم از اون حالت استفاده کنیم یعنی فقط از حالت زیر می‌توانیم استفاده کنیم
from module import name

از relative import نمی‌توانیم برای import کردن پکیج‌های دیگر که در پکیج‌مون نیستن استفاده کنیم و فقط از پکیج‌هایی که در پکیج‌اصلی هستند استفاده کنیم.

حالا با چیزهایی که یاد گرفتیم بیایم و یکمی روی برنامه‌ای که تا این مرحله روش کار کردیم تغییراتی ایجاد کنیم و نحوه استفاده ازش رو ببینیم

در داخل فولدر demo_reader یک فولدر جدید ایجاد کنید به اسم util و مانند آموزش‌های قبلی __init__ رو بسازید و هم‌چنین یک فایل جدید به اسم writer.py بسازید و محتویات زیر رو داخل اون قرار بدید

import sys def main(opener): &quot&quot&quot Opens the file and writes the data to it. &quot&quot&quot f = opener(sys.argv[1], mode=&quotwt&quot) f.write(&quot &quot.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 خواهد بود

امیدوارم از این قسمت لذت برده باشید


python3pythonoopdry
شاید از این پست‌ها خوشتان بیاید