سلام خدمت همه عزیزان. خوش اومدید به یکی دیگه از نوشته هام داخل ویرگول. یادت باشه اگه از این مقالم خوشت اومد یه نگاه به دیگر مقالاتم بندازی 👍

ابتدا بپردازیم به اینکه برنامه نویسی ماژولار چیه ؟!
برنامهنویسی ماژولار یعنی شکستن کد به قسمتهای کوچیک و مستقل که هر کدوم یه وظیفه خاص انجام میدن. این قسمتها رو ماژول میگیم.
ماژول توی پایتون همون فایل py. هست که یه سری متغیر، تابع یا کلاس داخلش تعریف شده و میتونیم ازش توی بقیه فایلها استفاده کنیم.
چرا از برنامهنویسی ماژولار استفاده میکنیم ؟
✅ کد خواناتر میشه : بجای یه فایل بزرگ، چند تا فایل کوچیک و مرتب داریم.
✅ استفاده مجدد از کد : یه بار مینویسیم، توی چند جای مختلف استفاده میکنیم.
✅ دیباگ راحتتر میشه : پیدا کردن مشکل توی یه فایل کوچیک راحتتره تا یه پروژه شلوغ.
✅ کار تیمی آسونتر میشه : هر برنامهنویس میتونه روی یه ماژول کار کنه.
script چیه ؟ توی پایتون، Script به فایلی گفته میشه که شامل کدهای اجراییه و وقتی اون رو اجرا میکنی، یه کاری رو انجام میده. به زبان ساده تر اگه یه فایل پایتونی رو بنویسی که وقتی اجرا میشه، یه خروجی یا عملکرد خاصی داشته باشه، بهش اسکریپت میگن.
تفاوت Script با Module چیه ؟
من فرضا یک کد پایتون دارم که داخل فایل main.py ذخیره شده ! اگه این فایل رو مستقیما صدا بزنم و کاری رو انجام بده، اینجا یک Script دارم. اما اگه فایل پایتونیم قراره داخل دیگر فایل ها وارد بشه، و اونجا صدا زده بشه، اینبار یک Module دارم. درنهایت یک فایل پایتونی هم میتونه تو نقش Script باشه هم تو نقش Module (با کمک __name__ و __main__)
یه مثال بزنم تا بهتر درک بشه. فایلی ساختم به اسم code.py و کد زیر داخلش قرار داره :
def my_func(x, y): return x ** y * 6
این دو خط بالا کل کدهایی هست که تو فایل code.py وجود داره. اگه من این فایل رو مستقیما صدا بزنم هیچ نتیجهایی نداره و اینجا میفهمم که این فایل صرفا یک ماژوله و باید تو فایل های دیگه صدا زده بشه و اونجا از توابع یا موارد دیگری که داخلش هست استفاده کنم.
(خیلی درگیر تفاوت بین این مفاهیم نشیم ! درواقع هر فایل پایتونی یک Module به حساب میاد حتی اگه Script باشه و خودش کارایی رو انجام بده)
پکیج (Package) چیه ؟ اگه من یک دایرکتوری بسازم و داخلش چندین تا Module قرار بدم، اینجا یک پکیج دارم ! درواقع Package مجموعهایی از ماژول هاست که توی یه پوشه قرار گرفتن و باهم یه سیستم کامل تر رو میسازن. داخل پکیج ها یه فایل به اسم
__init__.py
وجود داره که باعث میشه اون دایرکتوری به عنوان پکیج شناخته بشه ! اگه خودمون یک پکیج ایجاد کردیم باید این فایل پایتونی رو داخلش ایجاد کنیم.
پکیج ها داخلشون میتونن یه پکیج دیگه هم داشته باشن. مثلا یک دایرکتوری دارم به اسم A که درونش 3 تا Module هست و یک دایرکتوری دیگه هم توی A دارم به اسم B و این هم ماژول های خاص خودش رو داره.

تو عکس بالا خیلی راحت میتونیم مفهوم Package و Module هارو درک کنیم ! یک Package دارم به اسم game که داخلش فایل init هم وجود داره (مخفف نوشتم) حالا داخل این پکیج 3 تا پکیج دیگه هم هست به اسم های Sound و Image و Level که داخل هرکدوم باز هم فایل init رو میبینیم چرا که اونها هم پکیج هستن ! درنهایت داخل این 3 پکیج ماژول های پایتونی وجود داره که هرکدوم کار خاصی رو انجام میدن.
کتابخانه (Library) چیه ؟ توی پایتون Package ها و Library ها تفاوت زیادی ندارن ! این مفهوم بیشتر برای زبان های دیگه بصورت جامع وجود داره اما داخل همین پایتون هم، Library یکم دید بزرگتری داره ! مثلا به پکیج هایی که چندین پکیج دارن و پیچیدگی خاصی دارن Library هم گفته میشه.
فریمورک (Framework) چیه ؟ فریمورک یه ساختار یا اسکلت از پیش آمادهست که بهت کمک میکنه سریعتر و منظمتر برنامه بنویسی. یعنی کلی ابزار و قانون و روش توی framework هست که باعث میشه کد راحتتر نوشته و نگهداری بشه.
فرق framework با کتابخونه یا پکیج ها چیه ؟ library مجموعهای از توابع و کلاسهاست که هر وقت نیاز داشتی ازشون استفاده میکنی. دقت کن، کد اصلی رو تو مینویسی و فقط از اون توابع کمک میگیری. از طرفی framework چارچوبیه که اسکلت برنامه رو آماده میکنه. مثال :
فریمورک Django برای وب ! جنگو ساختار کلی پروژه، پوشهبندی، مدیریت دیتابیس و غیره رو آماده کرده. تو فقط منطق وبسایت رو مینویسی. یعنی مشخص کرده که کدهای فرضا HTML باید تو فلان دایرکتوری قرار بگیرن، کدهای مربوط به جاوا اسکریپت تو فلان دایرکتوری تااا آخر. اون یک ساختاری تعریف کرده و من طبق ساختار اون باید کدهام رو بنویسم ! اما توی library ها من فقط کتابخانه یا پکیج مدنظرم رو اضافه میکنم و هرجا و به هر روشی که خواستم ازش استفاده میکنم.
نظرت چیه یکم استراحت کنی ؟ آفرین. حالا تا داری استراحت میکنی این رو بگم که اگه شما آیدی من رو تو هر شبکه اجتماعی اعم از تلگرام، یوتیوب، اینستاگرام و... وارد کنید حساب من بالا میاد و میتونید از دیگر آموزش هام استفاده کنید 😒👍
ماژولها توی پایتون سه حالت اصلی دارن :
ماژولهای پیشفرض (Built-in Modules) : این ماژولها همزمان با نصب پایتون به صورت خودکار نصب میشن و همیشه در دسترسن (ماژول های os - sys و...)
ماژولهای خارجی (External Modules) : این ماژولها بصورت پیشفرض داخل پایتون وجود ندارن و از منابع خارجی با دستور pip نصب میشن (راجب pip در ادامه توضیح میدم) مثال :
pip install colorama
با این دستور colorama برای من نصب میشه و میتونم از این ماژول در پروژهام استفاده کنم.
ماژولهای شخصی (Custom Modules) : همینطور که از اسمش پیداست این ماژول هارو خودمون ایجاد میکنیم و در دیگر ماژول ها ازشون استفاده میکنیم.
روشهای اضافه کردن ماژول و پکیج در پایتون
تو پایتون برای استفاده از کدهای نوشتهشده در ماژولهای دیگه یا پکیجها از دستور import استفاده میکنیم. استفاده از import : این کلمه یک ماژول رو بصورت کامل به کد اضافه میکنه ! باید بعد از کلمه import اسم ماژول مدنظر رو بنویسیم. مثال :
import requests
حالا برای دسترسی به توابع داخل این ماژول، باید اسم ماژول رو بنویسیم و بعدش . بزاریم و اسم تابعی که میخوایم فراخانی بشه رو وارد کنیم. مثال :
requests.get('test.com')
میتونیم همراه با import از from هم استفاده کنیم اگه فقط نیاز به یک بخشی از یک ماژول رو داریم. مثلا من از ماژول requests فقط به تابع get احتیاج دارم بنابراین مینویسم :
from requests import get
get('test.com')
(اگه اسم تابعی که import کردی، توی کدت با یه اسم دیگه تداخل داشته باشه ممکنه مشکل ایجاد بشه)
من میتونم , بزارم و اسم دیگر توابع رو هم بدم تا اوناهم اضافه بشه. مثال :
from requests import get, post
میتونم علامت * بزارم تا تمام توابع یا هرچیز موجود توی اون ماژول رو برام اضافه کنه. مثال :
from requests import * get('test.com')
من این روش رو زیاد پیشنهاد نمیکنم، چرا ؟ به دو دلیل :
1 - اگه توابعی با اسمهای مشابه در چند ماژول باشن، ممکنه تداخل ایجاد بشه.
2 - پیدا کردن اینکه هر تابع از کدوم ماژوله سختتر میشه.
استفاده از کلمه as ! ما میتونیم ماژول یا بخشی از کدهای ماژول رو import کنیم ولی با یک اسم مستعار داخل پروژمون از اونها استفاده کنیم. مثال :
import requests as rs rs.get('test.com') یا from requests import get as g g('test.com')
وقتی داریم ماژول یا پکیجی رو import میکنیم، نقطه (.) نقش مشخص کردن مسیر رو داره. این یعنی با استفاده از نقطه داریم به پایتون میگیم کجا دنبال ماژول بگرده. ما یک Package داریم با این ساختار :
mypackage/ __init__.py module1.py module2.py
داخل module1.py تابع زیر قرار داره :
def say_hello():
return "Hello. I am module1"
اگه من بخوام تابع say_hello رو مستقیما به پروژه اصلیم اضافه کنم باید بدین شکل import کنم :
from mypackage.module1 import say_hello # اینطوری هم میتونم بکنم from mypackage.module1 import say_hello as sh
همینطور که تا الان چند بار گفته شد، هر فایل پایتونی میتونه هم Script باشه و هم ماژول ! یه سوال ؟! آیا میشه کاری کرد که اگه فایل پایتونیم مستقیم اجرا شد یکسری کارهارو انجام بده ولی اگه از طریق یک فایل دیگه صدا زد شد اون کارهارو انجام نده ؟! بله میشه.
پایتون یه متغیر داخلی به نام __name__ داره که مقدارش به دو شکل ممکنه باشه :
اگه اون فایل پایتونی مستقیم صدا زده بشه مقدار این متغییر برابر میشه با __main__
اما اگه من فایل رو import کنم به یک پروژه دیگه و اونجا اجراش کنم، مقدار این متغییر برابر میشه با اسم ماژولی که داخلش ساخته شده. درنهایت بهترین روش برای اینکه یه بخش از کد فقط در صورتی اجرا بشه که فایل مستقیم اجرا شده باشه (و موقع ایمپورت شدن اجرا نشه) اینه که اون کد رو داخل این شرط بذاریم :
def main(): print("این فایل مستقیم اجرا شده!")
if __name__ == "__main__": main()
وقتی توی پایتون یه ماژول یا پکیج رو import میکنی، پایتون یک مسیر مشخص رو برای پیدا کردن اون دنبال میکنه. این مسیر از مهمترین و نزدیکترین محل شروع میشه و به دورترین گزینه میرسه.
در ادامه به ترتیب توضیح میدم که پایتون چطور و از کجا ماژولها رو پیدا میکنه...
بررسی ماژولهای داخلی (Built-in Modules) : پایتون اول از همه بررسی میکنه که آیا ماژولی که import کردی، جز ماژولهای داخلی (Built-in) هست یا نه (sys - os - time)
بررسی دایرکتوری اسکریپت فعلی (Current Script Directory) : اگه ماژول توی Built-in نبود، پایتون میره سراغ دایرکتوریایی که اسکریپت در حال اجرا توش قرار داره. یعنی اگه توی همون پوشهای که اسکریپتت هست یه فایل با اسم ماژول وجود داشته باشه، پایتون اونو پیدا میکنه.
بررسی sys.path و مسیرهای پیشفرض پایتون : اگه هنوز Module پیدا نشده باشه، پایتون لیست مسیرهایی که توی sys.path هست رو یکییکی بررسی میکنه. با کد زیر لیست مسیرهای sys.path رو میبینیم :
import sys
print(sys.path)
نمونه خروجی :
[ ' ', # current directory 'S:\\Python 13\\python313.zip', # ماژولهای فشرده داخل یک فایل زیپ 'S:\\Python 13\\DLLs', # فایلهای دی ال ال برای ماژولهای سطح پایین 'S:\\Python 13\\Lib', # کتابخانه استاندارد پایتون 'S:\\Python 13', # دایرکتوری نصب پایتون 'S:\\Python 13\\Lib\\site-packages' # ماژول هایی که با pip نصب شدن ]
آیا میتونیم به sys.path آدرس جدیدی اضافه کنیم ؟ بله میشه منتهی این ادرس موقتیه و فقط تا زمانی که برنامه درحال اجراست تو این لیست باقی میمونه. کد :
import sys sys.path.append(r'PATH')
نکته. به کد زیر دقت کنید :
import random print(random) # <module 'random' from 'S:\\Python 13\\Lib\\random.py'> print(random.__file__) # 'S:\\Python 13\\Lib\\random.py'
طبق این دو حالت میتونم به آدرس اون ماژول دسترسی پیدا کنم.
pip چیه ؟ pip یه ابزار مدیریت پکیج تو پایتونه. کارش نصب، آپدیت و حذف کتابخونههاست.
پکیجها از PyPI (مخزن اصلی پکیجهای پایتون) دانلود میشن. وقتی دستوری مثل pip install رو میزنی، pip فایل مورد نظر رو پیدا میکنه، وابستگیها رو چک میکنه و نصبش میکنه.
نحوه کار با pip :
pip install package_name
این دستور پکیج مورد نظر رو از PyPI دانلود میکنه و روی سیستم نصب میکنه.
pip uninstall package_name
این دستور پکیج رو حذف میکنه.
pip install --upgrade package_name
این دستور پکیج رو به آخرین نسخه بروز میکنه.
pip list
این دستور فهرستی از تمام پکیجهای نصب شده رو بهت نشون میده.
pip list --outdated
با این دستور لیست پکیج هایی که آپدیت براشون اومده رو میتونم ببیبنم.
pip به صورت اتوماتیک مسیرهایی که پایتون از اونها برای نصب پکیجها استفاده میکنه رو میشناسه و پکیجها رو توی site-packages نصب میکنه. این یعنی وقتی پکیجی رو نصب میکنی، اون پکیج به صورت خودکار توی sys.path قرار میگیره و در هر کجا که import استفاده کنی، قابل دسترسیه.
وقتی از یک پروژه پایتونی میخوایم استفاده کنیم، یک فایل به اسم requirements.txt وجود داره که داخل این فایل اسم ماژول ها و پکیج هایی قرار داره که توی پروژه استفاده شده و ما باید اون پکیج هارو دانلود کنیم تا بتونیم پروژه رو بدون خطا اجرا کنیم.
pip install -r requirements.txt
با این دستور تمام پکیج های موجود در requirements.txt رو نصب میکنم.
pip freeze > requirements.txt
با این دستور لیست پکیج هایی که نصب دارم رو داخل فایل requirements.txt قرار میدم تا بعدا بتونم همه رو باهم نصب کنم.