آموزش دستور import در پایتون
اگر قبلا با پروژه پایتونی که بیشتر از یک ماژول داشته کار کرده باشید، پس به احتمال زیاد به دستور import برخورد کردهاید. حتی برای برنامهنویسان حرفهای هم ممکن است دستورات import گیج کننده باشند. در این مقاله در رابطه با دستور import و انواع مطلق و نسبی آن اطلاعات مفیدی کسب خواهید کرد.
# دستور ایمپورت(import) پایتون چیست؟
در این مقاله در رابطه با دستور ایمپورت پایتون صحبت میکنیم. import در زبان انگلیسی به معنی وارد کردن است و در پایتون به معنی وارد کردن یک ماژول به کد فعلی است. پایتون برای اینکه هسته اصلی زبان خود را سبک نگهدارد امکانات کمی را در اختیار برنامهنویس قرار میدهد و اگر برنامه نویس بخواهد به امکانات بیشتری دسترسی پیدا کند، باید ماژولها را ایمپورت کند. سینتکس کلی دستور import به شکل زیر است:
import modulename
پایتون به صورت پیشفرض متدهایی را در اختیار شما قرار داده که بدون نیاز به ایمپورت میتوانید از آنها استفاده کنید. مثلا متد ()str به شما اجازه میدهد یک آبجکت را به نوع string تبدیل کنید. اما اگر امکانات بیشتری بخواهید، مثلا بخواهید با تاریخ کار کنید، باید دیگر ماژولها را import کنید.
قبل از اینکه به بحث import وارد شویم، بیایید ببینیم که ماژول چیست؟
دوره پیشنهادی: دوره آموزش پایتون (python)
# تعریف ماژول در پایتون
ماژول پایتون به فایلی گفته میشود که پسوند py. داشته و حاوی کدهای پایتون است. هر فایل پایتونی میتواند ماژول باشد. وظیفه ماژولها اینست که کدهایی که شبیه به هم هستند را در یک فایل دسته بندی کنند تا بتوانید به آسانی آنها را در جایی دیگر استفاده کنید.
برای دسترسی به ماژولها شما باید از دستور import استفاده کنید. دستور ایمپورت پایتون کدهایی که در ماژول دیگر هست را میخواند و به شما اجازه میدهد تا از آنها استفاده کنید.
بسیاری از ماژولهایی که میتوانید از آنها استفاده کنید، در کتابخانه استاندارد پایتون هستند. این کتابخانه در همه جای کد پایتون در دسترس است. شما میتوانید هر ماژول را از کتابخانه استاندارد پایتون import کنید بدون اینکه نیاز به نصب چیزی داشته باشید. همچین میتوانید از pip برای نصب ماژولهای دیگران استفاده کنید.
# استفاده از دستور import پایتون
دستور import پایتون یک کدهایی که در یک ماژول هست را به ماژول دیگری وارد میکند. دستورات import معمولا در بالاترین خط فایل پایتون قرار میگیرند بخاطر اینکه اینکار باعث میشوند ساختار کد شما تمیزتر به نظر برسد.
برای ایمپورت کردن یک ماژول، کافیست نام ماژول را در مقابل دستور import قرار دهید. به طور مثال اگر بخواهید ماژول sys پایتون را ایمپورت کنید، به شکل زیر عمل کنید:
import sys
# مثال از دستور import پایتون
فرض کنید که میخواهیم ماژول time را به برنامه خود اضافه کنیم. از آنجایی که ماژول time به صورت پیشفرض در کتابخانه استاندارد پایتون وجود دارد، نیازی به نصب ندارید. با کد زیر میتوانید ماژول time را ایمپورت کنید:
import time
حالا که این ماژول را ایمپورت کردهایم،میتوانیم از آن استفاده کنیم. در کد بالا ما ماژول time را ایمپورت کردیم، و حالا میتوانیم به تمام متدها و فانکشنهای آن دسترسی داشته باشیم.
برای دسترسی به اطلاعات داخل ماژول time باید از عملگر نقطه استفاده کنیم. فرض کنید میخواهیم متد ()sleep را از ماژول time صدا بزنیم. برای اینکار میتوانیم کد زیر را اجرا کنیم:
import time
time.sleep(3)
در کد بالا ما ابتدا ماژول time را وارد کردیم. پایتون در کتابخانه استاندار خود این ماژول را پیدا کرده و برای ما وارد میکند. سپس با عملگر نقطه از داخل ماژول time متد sleep را صدا زدیم.
# وارد کردن چند ماژول با دستور import پایتون
تا اینجا ما فقط یک ماژول را ایمپورت کردهایم. اما میتوانیم هر تعداد ماژول که میخواهیم ایمپورت کنیم. فرض کنید ما میخواهیم ماژولهای time و random را ایمپورت کنیم. میتوانیم مانند کد زیر عمل کنیم:
import time
import random
حالا ما دو ماژول را ایمپورت کردهایم و میتوانیم به فانکشنهای آنها دسترسی پیدا کنیم. فرض کنید میخواهیم یک عدد تصادفی بین 1 تا 10 داشته باشیم و بعد از آن زمان را چپ کنیم. میتوانیم به شکل کد زیر کار کنیم:
import time
import random
print(random.randint(1, 10))
timestamp = time.time()
current_time = time.ctime(timestamp)
print(current_time)
وقتی برنامه را اجرا کنیم به این شکل نتیجه میدهد:
4
Fri Apr 17 08:09:22 2020
در کد بالا ابتدا ماژولهای time و random را ایمپورت کردهایم. سپس از random.randint() استفاده کردیم تا یک عدد تصادفی ایجاد شود. بعد، با ماژول time زمان فعلی را دریافت و چاپ کردیم.
# import در کنار from پایتون
دستور import به شما امکان میدهد تمام فانکشنهایی که در یک ماژول وجود دارد را وارد کنید. اما اینکار همیشه درست نیست. گاهی اوقات شما فقط تعداد کمی از فانکشنهایی که در یک ماژول وجود دارد را نیاز دارید. در این حالت میتوانید از دستور from استفاده کنید. دستور form به شما اجازه میدهد دقیقا همان چیزی که میخواهید را import کنید و نه بیشتر. سینتکس آن به شکل زیر است:
from [module] import [function or value]
فرض کنید که ما فقط به متد choice از ماژول random نیازمندیم. برای اینکار میتوانیم از کد زیر استفاده کنیم:
from random import choice
fruits = ["Apple", "Pear", "Banana"]
print(choice(fruits))
اگر کد را اجرا کنیم، به شکل زیر نتیجه میدهد:
Pear
ما از دستور from در کنار random استفاده کردیم تا مشخص کنیم که فقط متد choice را نیاز داریم. زمانی که با from یک فانکشن را وارد میکنید، دیگر نیازی نیست از عملگر نقطه برای دسترسی به آن استفاده کنید.
# اختصاص نام مستعار به importهای پایتون
شما میتوانید برای ماژولهایی که وارد کردهاید، نام مستعار انتخاب کنید تا دسترسی به آنها راحتتر شود. این موضوع زمانی مناسب است که نام ماژول بلند بوده یا نام ماژول با یک متغیر در تداخل باشد. برای تغییر نام ماژول از دستور as استفاده میکنیم. مثلا در کد زیر نام ماژول time را به t تغییر دادهایم:
import time as t
print(t.time())
نتیجه کد بالا:
1587111506.6014798
در کد بالا به ماژول time یک نام مستعار دادیم. حالا اگر بخواهیم از ماژول time استفاده کنیم باید از t استفاده کنیم.
# importهای مطلق(absolute)
تا اینجا به اندازه کافی در رابطه با importهای پایتون یاد گرفتهاید. حالا وقت آنست که نوع absolute از importهای پایتون را بیاموزیم. در importهای مطلق برای وارد کردن یک ماژول باید به طور کامل مسیر آن را مشخص کنید.
مثلا فرض کنیم ساختار دایرکتوری ما به شکل زیر است:
└── project
├── package1
│ ├── module1.py
│ └── module2.py
└── package2
├── __init__.py
├── module3.py
├── module4.py
└── subpackage1
└── module5.py
یک دایرکتوری project وجود دارد که شامل دو زیردایرکتوری، package1 و package2 است. دایرکتوری package1 دارای دو فایل module1.py و module2.py است.
دایرکتوری package2 دارای سه فایل است: دو ماژول، module3.py و module4.py، و یک فایل __init__. همچنین شامل یک دایرکتوری، subpackage1 است که به نوبه خود حاوی یک فایل module5.py است.
بیایید موارد زیر را فرض کنیم:
1. package1/module2.py شامل یک تابع ، function1 است.
2. package2/__ init__.py شامل یک کلاس، class1 است.
3. package2/subpackage1/module5.py شامل یک تابع، function2 است.
موارد زیر نمونه های عملی import مطلق است:
from package1 import module1
from package1.module2 import function1
from package2 import class1
from package2.subpackage1.module5 import function2
دقت کنید که حتما باید مسیر کامل را به هر پکیج یا ماژول مشخص کنید. فقط به جای / از نقطه استفاده میکنید.
+ مزایا و معایب import مطلق
import مطلق به import نسبی ترجیح داده می شود زیرا کاملاً واضح و سرراست است. به آسانی می توان فقط با مشاهده دستور گفت که ماژول وارد شده کجاست. در واقع، PEP 8 به صراحت import مطلق را توصیه می کند.
با این حال، گاهی اوقات، import مطلق می تواند طولانی باشد. تصور کنید چنین دستوری دارید:
from package1.subpackage2.subpackage3.subpackage4.module5 import function6
و این اصلا خوب نیست. راه حل چیست؟ importهای نسبی.
# importهای نسبی(relative)
در importهای نسبی شما ماژول را براساس مکان فعلی خود وارد میکنید. دو نوع import نسبی وجود دارد: ضمنی و صریح. import نسبی ضمنی در پایتون 3 منسوخ شده است، بنابراین من آنها را در اینجا پوشش نمی دهم.
+ نحو و مثالهای عملی
در مثالهای زیر ما بر اساس مکان فعلی کد خود و مکان ماژولی که میخواهیم وارد کنیم، مسیر را مشخص میکنیم. در این روش از نماد تقطه استفاده میشود.
from .some_module import some_class
from ..some_package import some_function
from . import some_class
نماد یک نقطه اشاره دایرکتوری فعلی دارد. دو نقطه اشاره به یک دایرکتوری بالاتر دارد. سه نقطه اشاره به دو دایرکتوری بالاتر دارد.
فرض کنید شما همان ساختار دایرکتوری قبلی را دارید:
└── project
├── package1
│ ├── module1.py
│ └── module2.py
└── package2
├── __init__.py
├── module3.py
├── module4.py
└── subpackage1
└── module5.py
محتویات فایل را به یاد بیاورید:
1. package1/module2.py شامل یک تابع ، function1 است.
2. package2/__ init__.py شامل یک کلاس، class1 است.
3. package2/subpackage1/module5.py شامل یک تابع، function2 است.
شما می توانید function1 را در فایل package1/module1.py از این طریق وارد کنید:
# package1/module1.py
from .module2 import function1
در اینجا فقط از یک نقطه استفاده می کنید زیرا module2.py در همان دایرکتوری قرار دارد که module1.py است.
شما می توانید class1 و function2 را به این روش در فایل package2/module3.py وارد کنید:
# package2/module3.py
from . import class1
from .subpackage1.module5 import function2
در اولین دستور import، یک نقطه به این معنی است که شما class1 را از دایرکتوری فعلی وارد می کنید.
در دومین دستور import، مجدداً از یک نقطه استفاده می کنید زیرا subpackage1 در همان دایرکتوری ماژول فعلی، که module3.py است، قرار دارد.
+ مزایا و معایب import نسبی
یک مزیت آشکار import نسبی این است که آنها کاملاً مختصر هستند. بسته به مکان فعلی، آنها می توانند دستور import مسخره طولانی را که قبلاً مشاهده کرده اید به چیزی ساده تبدیل کنند:
from ..subpackage4.module5 import function6
متأسفانه، import نسبی می تواند نامرتب باشد، به ویژه برای پروژه های مشترک که ساختار دایرکتوری به احتمال زیاد تغییر می کند. import نسبی نیز به اندازه مطلق قابل خواندن نیست و تشخیص محل import نیز کار آسانی نیست.
# نتیجه گیری
وارد کردن ماژول ها بخش مهمی از کار با پایتون است که به شما امکان می دهد توابعی را فراخوانی کنید که بخشی از برنامه اصلی شما نیستند. ماژولهایی که با آنها کار میکنید میتوانند بخشی از کتابخانه استاندارد پایتون باشند، با استفاده از pip نصب شوند یا توسط شما ایجاد شوند.