وقتی در حال پیادهسازی یک پروژه واقعی و متوسط یا بزرگ باشیم، کدهای زیادی در برنامه ما وجود دارد. ماژول ها در پایتون به ما کمک میکنند تا این کدها را سازماندهی کنیم. هر ماژول یک فایل python است که کدهایی دارند. با وارد کردن اینها میتوانیم از کدهای آن در فایل دیگر استفاده کنیم.
فرض کنید برای یک پروژه، بخش ورود کاربران را نوشتهایم. حالا میخواهیم برای پروژه دیگر، دقیقاً مشابه همین سیستم را پیاده کنیم. یعنی باید کدها و توابع مشابهی را بنویسیم!
اولین راهحلی که به ذهنمان میرسد این است که کدهای قبلی را کپی و در فایل جدید استفاده کنیم. نمیگویم این روش بد است! اما مدیریت تغییرات و سازماندهی این کدها کمی سخت میشود.
به کمک ماژولها در پایتون علاوه بر اینکه میتوانیم کدهایمان را سازماندهی کنیم، میتوانیم از بعضی کدهای پرکاربرد در چند پروژه استفاده کنیم. منظورم از ساماندهی، نوشتن کدهای برنامه در فایلهای جداگانه و استفاده از این فایلها در یکدیگر است.
در این آموزش ابتدا یاد میگیریم چطور یک ماژول در پایتون ایجاد کنیم. سپس نحوه فراخوانی و استفاده از ماژولها را یاد میگیریم. در انتها بحثهای تکمیلی نظیر اینکه moduleها را در کجا استفاده کنیم بحث میکنیم.
ساخت ماژول پایتون
تا این جلسه از آموزش پایتون کدهایمان را در یک فایل با فرمت .py
مینوشتیم. این فایل را بنا به نیازمان با ۴ روشی که برای اجرای پایتون یاد گرفتیم، در خط فرمان یا IDEها اجرا میکنیم.
هر فایل .py
یک ماژول در پایتون است! یعنی میتوانیم کدهای آن را در یک فایل دیگر فراخوانی و استفاده کنیم. فرض کنید تابع greetings()
را برای چاپ یک پیام ساده در فایل myprint.py
نوشتهایم:
def greetings(name): print("Hello {name}, Welcome to SabdDanesh!")
الآن یک ماژول به نام myprint داریم که میتوانیم از آن در فایلهای دیگر استفاده کنیم. 🙂
قبل از اینکه از ماژول استفاده کنیم، بهتر است بدانیم چه نوع کدهایی در ماژول پایتون قرار میگیرد؟ تقریباً هر نوع کدی میتوانیم در moduleها قرار دهیم!
- تابعهای پایتون که خودمان تعریف کردهایم.
- متغیرهای مختلف نظیر دیکشنری، رشته پایتون یا لیستها
- حتی کدهایی در اسکوپ اصلی ماژول! (البته کدهای اجرایی در ماژول ممکن است مشکلاتی برایمان ایجاد کند که در بخش انتهایی مرور میکنیم.)
وارد کردن module پایتون
حالا میخواهیم این تابع را در فایل app.py
که در کنار myprint.py
قرار دارد صدا بزنیم. برای این کار، ابتدا باید ماژول را در فایل app وارد کنیم. به زبان ساده، به پایتون میگوییم که:
کدهای این ماژول را در فایل فعلی کپی کن! چون میخواهیم از آنها استفاده کنیم.
برای استفاده از ماژول از دستور import در پایتون استفاده میکنیم. این دستور را میتوانیم در ۳ ساختار مختلف به کار ببریم که در ادامه آنها را یاد میگیریم.
دستور import ماژول در پایتون
ساختار کلی این دستور مشابه زیر است:
import module1 [,module2 [,module3 ...]]
برای استفاده از ماژول myprint دستور زیر را در ابتدای فایل app.py مینویسم:
import myprint
اگر خواستیم چند ماژول را همزمان ایمپورت کنیم، از کاما (,
) بین اسمها استفاده میکنیم. مثلاً در دستور زیر، علاوه بر ماژول خودمان، ۲ ماژول محاسبات ریاضی و توابع رندوم پایتون را فراخوانی کردهام:
import myprint, math, random
وقتی بخواهیم تابعgreetings()
را در فایل app صدا بزنیم، باید «نام ماژول» به همراه نقطه (.
) را به ابتدای اسم تابع اضافه کنیم. چیزی شبیه زیر:
import myprint
myprint.greetings("omid")
مثلاً برای تولید یک عدد رندوم بین 0 تا 20 میتوانیم مشابه زیر عمل کنیم:
import random
rnd = random.randint(0, 20)
دستور from import
فایلی به نام utils.py
با کدهای زیر ایجاد میکنم. اگر هنوز نمیدانید کلاس در پایتون چیست، نگران نباشید، فقط میخواهم فراخوانی آنها را در ماژولهای پایتون بررسی کنیم. در جلسات بعدی با این مفهوم آشنا خواهیم شد.
# utils.py
def calc(x): return (x**2)*(x+1)
class Person(): def __init__(self, name):
self.name = name
users = ['ghazal', 'ehsan', 'omid']
اگر این ماژول را در فایل دیگری (مثلاً app.py) فراخوانی کنیم، به تمام توابع، کلاسها و متغیرهای آن دسترسی خواهیم داشت:
# app.py
import utils
print( utils.calc(5) )
p1 = utils.Person('farinaz')
utils.users.append('negar')
گاهی اوقات به همه کدهای یک ماژول نیازی نداریم. مثلاً فقط میخواهیم از تابع calc() استفاده کنیم. بنابراین ایمپورت کردن سایر کدها، غیر ضروری و بهنوعی غیر حرفهای است!
برای اینکه فقط یک یا چند مورد را از ماژول فراخوانی کنیم، از ساختار from ... import ...
استفاده میشود.
# import single thing from madule
from utils import calc
# import multiple things
from utils import calc, users
به همین سادگی! 🙂
در این حالت، وقتی بخواهیم تابع یا متغیر را صدا بزنیم، نیازی به نوشتن نام ماژول در ابتدای آنها نیست. یعنی من میتوانم مشابه زیر از تابع و لیستی که ایمپورت شد استفاده کنم:
from utils import calc, users
print( calc(5) )
اگر بخواهیم همه توابع و متغیرهای موجود در ماژول را به این روش صدا بزنیم، از علامت ستاره (*
) بهجای نام بردن از همه توابع استفاده میشود:
from utils import *
به این شکل، تمام ماژول در کد وارد میشود و برای استفاده از توابع نیازی به نوشتن نام module نداریم.
ایمپورت با تغییر نام در پایتون
گاهی نیاز داریم نام یک ماژول یا چیزهایی که از آن ایمپورت کردهایم را تغییر دهیم. این مسئله میتواند دو دلیل کلی داشته باشد:
- بخواهیم نامش را خلاصه کنیم یا با نام دلخواه فراخوانی کنیم.
- این ماژول یا توابع آن با کدهای ما همنام باشد.
برای تغییر نام ماژول در پایتون هنگام فراخوانی از کلمه کلیدی as استفاده میکنیم. این روش اصطلاحاً «تعیین نام مستعار یا alias» نیز شناخته میشود.
import random as rnd
در قطعه کد بالا، ماژول random را با نام مستعار rnd در کد وارد کردهام. از این پس بهجای random باید از rnd استفاده کنیم:
rnd.randint(0, 20)
این کار را میتوانیم برای توابعی که import میشوند نیز استفاده کنیم؛ مثل کد زیر:
from utils import calc as calculate
print( calculate(5) )
پیشرفته: ماژول های پایتون
در ابتدای آموزش بهطور مختصر موارد استفاده از ماژولها را با شما مرور کردم. شخصاً ۴ کاربرد کلی برای ماژولها در پایتون در نظر میگیرم:
- سازماندهی کدها با تبدیل مجموعهای از توابع مرتبط به هم به یک ماژول
- امکان استفاده مجدد از برخی کدها (و ماژولار شدن برنامه ما)
- به کمک ماژولبندی میتوانیم از کدهای دیگران (یا کدهای قبلی خودمان) استفاده کنیم.
- میتوانیم این ماژولها را منتشر کرده یا در اختیار دیگران قرار دهیم.
در جلسه بعدی یاد میگیریم چطور به دنیایی از ماژولهایی که توسط دیگران توسعه داده شده دسترسی پیدا کرده و از آنها استفاده کنیم. مثلاً به کمک همین ماژولها، بدون نیاز به کدنویسی پیچیده، با فایل اکسل در پایتون کار میکنیم!
مسیر جستجوی ماژولهای python
وقتی دستور import استفاده میشود، مفسر پایتون چند مسیر را بررسی میکند تا ماژول مورد نظرمان را فراخوانی کند. ابتدا در لیست ماژولهای built-in که با نصب پایتون وجود دارند جستجو کرده و اگر چیزی پیدا نشد در سایر مسیرها دنبال ماژول مورد نظر میگردد.
بهطور کلی به ترتیب مسیرهای زیر بررسی میشوند:
- ماژولهای توکار (Built-in)
- فولدر فعلی
- فولدرهایی که در متغیر محلی PYTHONPATH سیستم عامل هستند. (همانی که در تنظیم path پایتون تعریف میشود.)
- چند فولدر در مسیر نصب پایتون
تابع dir برای بررسی ماژول
تابع dir()
ماژولی که import کردیم را بهعنوان ورودی میگیرد و لیستی از توابع و متغیرهای درون آن را به ما میدهد. معمولاً از این تابع برای بررسی ماژول یا کارهای مربوط به مدیریت خطای پایتون استفاده میشود.
import utils
print( dir(utils) )
# output:
# ['Person', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'calc', 'users']
در خروجی این قطعه کد، میبینید که چند نام دیگر به غیر از ۳ موردی که در ماژول بود وجود دارند. این موارد و کاربردهایشان را در جلسات پیشرفته دوره مکمل (بعد از class) صحبت میکنیم.
در مستندات این بحث (+)، با متغیری به نام __name__
مواجه میشوید. استفاده و عملکرد این متغیر را در جلسه تکمیلی ماژولهای پایتون در دوره مکمل با هم بررسی میکنیم. (عید 1401 منتشر میشود.)
امیدوارم الآن بتوانید یک ماژول برای خودتان ایجاد کنید، آن را وارد فایل دیگری کرده و از ماژولهای دیگران استفاده کنید. همین الآن سعی کنید دو فایل ساده شبیه به فایلهای آموزش ایجاد و کمی تمرین کنید.
اگر سؤال یا نظری دارید از بخش دیدگاهها مطرح کنید وگرنه همین الآن به جلسه بعدی بروید تا یاد بگیرید چطور ماژولهای بیشتری را نصب کنید. 🙂