Table of Contents
تفاوت «ماژول» و «import» در عمل
در این بخش فرض میکنیم که پیشتر در همین فصل با مفهوم کلی «کتابخانه» و «ماژول» آشنا شدهاید. اینجا تمرکز ما فقط روی شیوههای مختلف وارد کردن ماژولها در کد پایتون است و اینکه هر روش چه اثری روی کد شما میگذارد.
ماژول (مثلاً math، random یا فایلی مثل my_utils.py) در واقع فایلی است که داخلش کد پایتون نوشته شده و میتوانیم از توابع، کلاسها و متغیرهای آن در برنامهٔ خودمان استفاده کنیم. برای دسترسی به آنها باید از دستورهای مختلف import استفاده کنیم.
در ادامه مهمترین الگوهای استفاده از import را میبینید.
وارد کردن کامل یک ماژول
سادهترین و رایجترین حالت:
import math
print(math.sqrt(16)) # استفاده از تابع sqrt از داخل ماژول mathنکتهها:
- بعد از
import math، نام ماژول (math) یک متغیر سراسری در برنامهٔ شما میشود. - برای دسترسی به هر عضو ماژول از نقطه استفاده میکنید:
math.sqrt،math.piو … - این روش:
- خوانایی خوبی دارد؛ هر کسی ببیند
math.sqrtاست، متوجه میشود تابع از کجاست. - ریسک تداخل اسم را کم میکند (کمتر با نام توابع/متغیرهای خودتان قاطی میشود).
این روش برای یادگیری و برای بیشتر برنامههای ساده روش پیشنهادی است.
وارد کردن با نام مستعار (`as`)
گاهی نام ماژول طولانی است یا قرار است زیاد از آن استفاده کنید؛ در این صورت میتوانید یک نام کوتاهتر به آن بدهید:
import math as m
print(m.sqrt(25))
print(m.pi)یا برای مثال مشهور:
import numpy as np
import pandas as pdنکتهها:
- فقط نامی که در کد خودتان استفاده میکنید عوض میشود؛ خود ماژول همان ماژول است.
- از این روش برای کوتاه و تمیز کردن کد استفاده میشود.
- سعی کنید نام مستعار واضح انتخاب کنید؛ مثلاً
math→mقابل حدس است، اماmath→xگیجکننده است.
وارد کردن فقط بعضی از اعضای ماژول
اگر فقط به یکی دو تابع یا متغیر از یک ماژول نیاز دارید، میتوانید فقط همانها را وارد کنید:
from math import sqrt, pi
print(sqrt(9)) # دیگر نیازی نیست بنویسیم math.sqrt
print(pi)نکتهها:
- الان نامهای
sqrtوpiمستقیماً در فضای نام (namespace) برنامهٔ شما وجود دارند. - نیازی نیست بنویسید
math.sqrt؛ ولی دیگر مشخص نیست اینها دقیقاً از کجا آمدهاند، مگر با نگاه کردن به بالای فایل (جایی کهimportنوشته شده است).
این روش زمانی مفید است که:
- زیاد از یک تابع خاص استفاده میکنید و نمیخواهید هر بار
math.را بنویسید. - میخواهید کد کوتاهتر شود.
اما مراقب تداخل نام باشید؛ اگر خودتان هم متغیری به نام pi تعریف کنید، یکی از آنها روی دیگری میافتد.
استفاده از نام مستعار برای اعضای ماژول
همانطور که میتوانیم برای ماژول نام مستعار تعیین کنیم، میتوانیم برای توابع و متغیرهایی که از آنها وارد میکنیم هم نام مستعار بگذاریم:
from math import sqrt as r, pi as PI
print(r(36))
print(PI)این کار در موارد زیر به درد میخورد:
- وقتی نام عضو طولانی است.
- وقتی میخواهید تفاوت بین ثابتها و متغیرهای معمولی را در نامگذاری مشخص کنید (مثلاً با حروف بزرگ).
وارد کردن «همه چیز» با `from module import *`
پایتون اجازه میدهد کل محتوای یک ماژول را با * وارد کنید:
from math import *
print(sqrt(16))
print(pi)
این کار به این معناست که «تقریباً» تمام اعضای عمومی ماژول (math) وارد فضای نام فعلی میشوند.
اما این روش تقریباً همیشه پیشنهاد نمیشود، بهخصوص برای تازهکارها، چون:
- معلوم نیست هر نامی که در کد استفاده میکنید از کجا آمده.
- احتمال تداخل نامها بسیار بالا میرود:
- اگر خودتان تابعی به نام
sqrtبنویسید، ممکن است رویmath.sqrtبیفتد. - خوانندهٔ کد باید حدس بزند که چه چیزهایی از ماژول وارد شدهاند.
بهتر است بهجای این روش، از یکی از روشهای قبلی (بهخصوص import module یا from module import name1, name2) استفاده کنید.
چندین ماژول در یک فایل
میتوانید در یک فایل پایتون چندین ماژول را با هم وارد کنید:
import math
import random
x = math.sqrt(49)
y = random.randint(1, 10)
print(x, y)یا به شکل فشردهتر در یک خط:
import math, randomولی معمولاً برای خواناتر شدن، هر ماژول را در یک خط جداگانه مینویسیم:
import math
import random
import datetimeنکتههای مرتبسازی:
- معمول است که
importها را بالای فایل، در ابتدای برنامه بنویسیم. - معمولاً ترتیب پیشنهادی:
- ماژولهای استاندارد پایتون (مثل
math,random,os) - کتابخانههای خارجی (مثلاً بعداً
numpy,pandas) - ماژولهای خودتان (فایلهای پروژهٔ خودتان)
وارد کردن ماژولهای خودتان (فایلهای دیگر)
اگر فایلی به نام helpers.py در همان پوشهٔ فایل اصلی شما وجود داشته باشد، میتوانید آن را مثل یک ماژول وارد کنید:
# فایل helpers.py
def salam():
print("سلام از helpers!")
# فایل main.py
import helpers
helpers.salam()نکتهها:
- نام فایل (
helpers.py) بدون پسوند.pyبه عنوان نام ماژول استفاده میشود (helpers). - هر دو فایل باید در یک پوشه (دایرکتوری) باشند، مگر اینکه ساختار پوشهها و پکیجها را (در مباحث پیشرفتهتر) تنظیم کرده باشید.
همچنین میتوانید از from helpers import salam هم استفاده کنید:
from helpers import salam
salam()وارد کردن فقط هنگام نیاز (import درون تابع)
معمولاً importها را در ابتدای فایل مینویسند، اما از نظر فنی میتوانید داخل یک تابع هم import کنید:
def calc():
import math
return math.sqrt(81)
print(calc())
این کار گاهی برای بهتعویق انداختن بارگذاری یک کتابخانهٔ سنگین استفاده میشود، ولی برای شروع بهتر است تمام importها را بالای فایل بنویسید تا کد خواناتر و قابلپیشبینیتر باشد.
نام فضای فعلی و جلوگیری از تداخل
هر متغیری که در فایل شما تعریف شود، در فضای نام (namespace) آن فایل قرار میگیرد. زمانی که مینویسید:
from math import pi
دیگر متغیری با نام pi در فضای نام شما وجود دارد. اگر بعداً بنویسید:
pi = 3
مقدار pi شما دیگر آن ثابت math.pi نخواهد بود، بلکه این مقدار جدید را میگیرد. برای جلوگیری از اینگونه تداخلها:
- یا از
import mathاستفاده کنید و همیشه بنویسیدmath.pi. - یا اگر مجبورید از
from math import piاستفاده کنید، سعی کنید روی همان نام چیزی تعریف نکنید.
اینکه چه روشی انتخاب میکنید، به سلیقه و سبک کدنویسی بستگی دارد، ولی در شروع کار، استفاده از import module امنتر و شفافتر است.
چگونه بفهمیم چه چیزی در یک ماژول وجود دارد؟
گاهی میخواهید ببینید داخل یک ماژول چه تابعها و متغیرهایی هست. در حالت تعاملی پایتون (یا در یک اسکریپت برای آزمون) میتوانید از dir() استفاده کنید:
import math
print(dir(math))
این دستور یک لیست از نام اعضای ماژول به شما میدهد. همچنین میتوانید از تابع help() برای گرفتن توضیح دربارهٔ ماژول یا یک تابع خاص استفاده کنید (توضیح کاملتر دربارهٔ مستندات و help() میتواند در بخشهای دیگر بیاید، اینجا فقط ایدهٔ کلی را میبینید):
import math
help(math.sqrt)نکتههای عملی هنگام استفاده از import
- تا حد امکان از
import moduleاستفاده کنید، مخصوصاً وقتی تازه شروع کردهاید. - از
from module import nameزمانی استفاده کنید که: - آن نام را خیلی زیاد استفاده میکنید،
- و مطمئنید با نامهای دیگر تداخل ندارد.
- از
from module import *پرهیز کنید؛ - هم کد را مبهم میکند،
- هم پیدا کردن خطاها را سختتر.
importها را همیشه در بالای فایل گروهبندی و مرتب کنید تا خواندن پروژه برای خودتان و دیگران راحتتر باشد.
این الگوهای مختلف وارد کردن ماژولها پایهٔ کار با کتابخانههای مختلف پایتون هستند؛ در بخشهای بعدی همین فصل با نمونههای واقعی و رایج (مثل math, random, datetime و نصب کتابخانههای خارجی) این مفاهیم را در عمل خواهید دید.