آموزش

کار با ماژول‌های پایتون

یاد بگیر چطور ماژول‌های پایتون رو بسازی و ایمپورت کنی. بهترین روش‌ها، مثال‌ها و ترفندها رو برای نوشتن کدهای پایتون بهینه، منظم و قابل استفاده مجدد کشف کن!

تاریخ انتشار:
29 شهریور 1405
پایتون
8 دقیقه
کاربرهای فینکا در چه شرکت‌هایی مشغول به کار هستند؟

وقتی برای اولین بار شروع به یادگیری پایتون می‌کنی، همه چیز رو در یک فایل می‌نویسی. این کار برای اسکریپت‌های کوچک خوبه، اما وقتی برنامه‌ت بزرگ می‌شه، خواندن، نگهداری و استفاده مجدد از یک فایل واحد در پروژه‌های مختلف سخت و حتی غیرممکن می‌شه. راه‌حلی که پایتون بهت می‌ده استفاده از ماژول‌هاست.

در این آموزش یاد می‌گیری که ماژول‌ها چی هستن، چطور اون‌ها رو ایمپورت کنی، چطور ماژول خودت رو بنویسی و با بهترین روش‌هایی که کدهای افراد مبتدی رو از کدهای حرفه‌ای و آماده‌ی تولید متمایز می‌کنه، آشنا می‌شی. قبل از اینکه نوشتن ماژول‌های خودت رو شروع کنی، پیشنهاد می‌کنیم نگاهی به دوره مقدمه‌ای بر پایتون برای علم داده ما در فینکا بندازی.

ماژول‌های پایتون چی‌ان؟

یک ماژول در واقع فقط یک فایل پایتونه. هر فایلی با پسوند .py که حاوی کدهای پایتون باشه (مثل توابع، کلاس‌ها، متغیرها یا منطق قابل اجرا) یک ماژول محسوب می‌شه.

وقتی فایلی به نام calculation.py رو ذخیره می‌کنی، در واقع ماژولی به نام calculation ساختی.

قدرت ماژول‌ها در اینه که می‌تونی اون‌ها رو در برنامه‌های دیگه ایمپورت کنی. به‌جای کپی و پیست کردن یک تابع در چندین اسکریپت، اون رو یک بار در یک ماژول تعریف می‌کنی و هر وقت نیاز داشتی ایمپورتش می‌کنی.

کتابخانه استاندارد پایتون هم دقیقاً به همین شکل کار می‌کنه؛ مجموعه‌ای از ماژول‌های از پیش ساخته شده مثل math، os و random که می‌تونی فقط با یک خط کد، اون‌ها رو وارد هر برنامه‌ای کنی.

به‌طور دقیق‌تر، در پایتون با سه نوع ماژول روبه‌رو می‌شی:

  • ماژول‌های داخلی: که همراه خود پایتون هستن، مثل math و os که الان بهشون اشاره شد.
  • ماژول‌های شخص ثالث: که از طریق pip نصب می‌شن، مثل numpy یا pandas.
  • ماژول‌های خودت: هر فایل .py که خودت بنویسی.

ایمپورت کردن ماژول‌ها در پایتون

برای استفاده از قابلیت‌های موجود در هر ماژول، باید اون رو در برنامه فعلی‌ت ایمپورت کنی. برای این کار از کلمه کلیدی import همراه با نام ماژول مورد نظرت استفاده کن. وقتی مفسر به یک دستور import می‌رسه، اون ماژول رو وارد برنامه‌ت می‌کنه.

تو می‌تونی با استفاده از عملگر نقطه (.) در کنار نام ماژول، از توابع داخل اون استفاده کنی.

اول بیا ببینیم چطور از ماژول‌های کتابخانه استاندارد استفاده کنیم. در مثال زیر، ماژول math در برنامه ایمپورت شده تا بتونی از تابع sqrt() استفاده کنی.

برای بهبود عملکرد، هر ماژول فقط یک بار در هر نشست مفسر ایمپورت می‌شه. بنابراین، اگر تغییری در ماژول‌هات دادی، باید مفسر رو دوباره راه‌اندازی کنی.

اگر می‌خوای ماژولی رو که قبلاً ایمپورت کردی دوباره بارگذاری کنی (مثلاً بعد از ویرایش اون)، از importlib.reload() استفاده کن.

توجه داشته باش که تابع داخلی و قدیمی reload() دیگه در پایتون 3 وجود نداره و در عوض importlib.reload() روش رسمی و فعلی برای بارگذاری مجدد ماژول‌ها در پایتون 3.4 به بالاست.

نکته: بارگذاری مجدد sys، __main__، builtins و سایر ماژول‌های کلیدی توصیه نمی‌شه. خیلی از ماژول‌های الحاقی طوری طراحی نشدن که بیش از یک بار مقداردهی اولیه بشن و در صورت بارگذاری مجدد ممکنه با خطاهای غیرقابل پیش‌بینی مواجه بشن. بهتره در طول توسعه، فقط ماژول‌های خودت رو دوباره بارگذاری کنی.

در پایتون 3.15 مفهومی به نام ایمپورت‌های تنبل (lazy imports) معرفی شده. این کار زمان راه‌اندازی رو با به تعویق انداختن بارگذاری ماژول‌ها تا زمانی که برای اولین بار استفاده بشن، کاهش می‌ده. این ویژگی خیلی مفیده چون مخصوصاً در پروژه‌های بزرگ، خیلی از ماژول‌ها در بالای فایل ایمپورت می‌شن، اما فوراً مورد نیاز نیستن.

نحوه نوشتن ماژول‌های پایتون شخصی

حالا که یاد گرفتی چطور یک ماژول رو در برنامه‌ت ایمپورت کنی، وقتشه ماژول خودت رو بنویسی و در برنامه دیگه‌ای ازش استفاده کنی. نوشتن یک ماژول دقیقاً مثل نوشتن هر فایل پایتون دیگه‌ای هست. بیا با نوشتن تابعی برای جمع و تفریق دو عدد در فایلی به نام calculation.py شروع کنیم.

اگر سعی کنی این اسکریپت رو در خط فرمان اجرا کنی، هیچ اتفاقی نمی‌افته چون به برنامه دستور ندادی کاری انجام بده. اسکریپت پایتون دیگه‌ای رو در همون دایرکتوری با نام module_test.py ایجاد کن و کد زیر رو در اون بنویس.

اگر module_test.py رو اجرا کنی، عدد "3" رو به‌عنوان خروجی می‌بینی. وقتی مفسر به دستور import رسید، ماژول calculation رو وارد کدت کرد و سپس با استفاده از عملگر نقطه، تونستی به تابع add() دسترسی پیدا کنی.

محافظت از کد قابل اجرا

هنگام نوشتن ماژول‌ها، یک عادت مهم رو باید در خودت ایجاد کنی: 

قرار دادن هر کدی که می‌خوای فقط به‌صورت مستقیم اجرا بشه (نه وقتی که ایمپورت می‌شه) در یک بلاک محافظ if __name__ == "__main__".

وقتی یک ماژول مستقیماً اجرا می‌شه، پایتون مقدار __name__ اون رو روی "__main__"  تنظیم می‌کنه. اما وقتی توسط اسکریپت دیگه‌ای ایمپورت می‌شه، __name__ به‌جای اون با نام فایل ماژول مقداردهی می‌شه. این یعنی دستور print  بالا وقتی کسی calculation  رو در برنامه خودش ایمپورت می‌کنه، به‌طور غیرمنتظره‌ای اجرا نمی‌شه.

روش‌های دیگه برای ایمپورت ماژول‌ها در پایتون

راه‌های دیگه‌ای هم برای ایمپورت کردن ماژول‌ها وجود داره:

  • استفاده از عبارت from .. import
  • استفاده از عبارت from .. import *
  • تغییر نام ماژول ایمپورت شده

استفاده از from module import name

عبارت from..import بهت اجازه می‌ده به‌جای ایمپورت کردن همه چیز، توابع یا متغیرهای خاصی رو از یک ماژول ایمپورت کنی. در مثال قبلی، وقتی calculation رو در module_test.py ایمپورت کردی، هر دو تابع add() و sub() ایمپورت شدن. اما اگه فقط به تابع add() در کدت نیاز داشته باشی چی؟ اینجا مثالی رو می‌بینی که نحوه استفاده از from..import رو نشون می‌ده.

در مثال بالا، فقط تابع add() ایمپورت و استفاده شده. به نحوه استفاده از add() دقت کن.

حالا می‌تونی مستقیماً و بدون استفاده از نام ماژول بهش دسترسی داشته باشی.

تو می‌تونی چندین ویژگی رو همزمان ایمپورت کنی، فقط کافیه در دستور import اون‌ها رو با کاما از هم جدا کنی. به مثال زیر نگاه کن:

استفاده از * from module import

با استفاده از این دستور می‌تونی تمام ویژگی‌های یک ماژول رو ایمپورت کنی. این کار باعث می‌شه تمام ویژگی‌های ماژول ایمپورت شده در کدت قابل مشاهده باشن.

اینجا مثالی برای توضیح استفاده از from .. import * آورده شده:

توجه کن که در دنیای حرفه‌ای، باید از استفاده از from..import و from..import* خودداری کنی. این کار فضای نامت رو با تمام اسامی اون ماژول پر می‌کنه، باعث می‌شه هنگام خوندن کد نفهمی یک تابع از کجا اومده و می‌تونه به‌صورت بی‌صدا اسامی‌ای رو که قبلاً تعریف کردی بازنویسی کنه. به‌جای اون‌ها از ایمپورت‌های صریح استفاده کن.

تغییر نام ماژول‌ها در پایتون

تو می‌تونی نام ماژولی که ایمپورت می‌کنی رو تغییر بدی، این کار در مواقعی مفیده که می‌خوای نام بامعنی‌تری به ماژول بدی یا نام ماژول برای استفاده‌های مکرر خیلی طولانیه. برای این کار می‌تونی از کلمه کلیدی as استفاده کنی. مثال زیر نشون می‌ده چطور در برنامه‌ت از اون استفاده کنی.

با تغییر نام calculation به cal در وقت خودت برای تایپ صرفه‌جویی کردی.

دقت کن که دیگه نمی‌تونی از calculation.add(1,2) استفاده کنی، چون نام calculation دیگه در برنامه‌ت شناخته نمی‌شه. اتفاقی که می‌افته اینه: وقتی برای یک ماژول نام مستعاری با as می‌سازی، نام اصلی دیگه در اون اسکریپت در دسترس نخواهد بود.

مسیر جستجوی ماژول در پایتون

ممکنه بخوای ماژول‌هات در برنامه‌ها یا پروژه‌های مختلفی استفاده بشن و مکان فیزیکی‌شون در دایرکتوری متفاوت باشه. اگه می‌خوای از ماژولی استفاده کنی که در دایرکتوری دیگه‌ای قرار داره، پایتون گزینه‌هایی رو در اختیارت می‌ذاره.

وقتی ماژولی به نام calculation رو ایمپورت می‌کنی، مفسر ابتدا به دنبال ماژول داخلی با همون نام می‌گرده. اگه اون رو پیدا نکرد، در لیستی از دایرکتوری‌هایی که توسط متغیر sys.path مشخص شدن، به دنبال فایلی به نام calculation.py می‌گرده. sys.path شامل این مکان‌هاست:

  • دایرکتوری حاوی اسکریپت ورودی (یا همون دایرکتوری فعلی)
  • متغیر PYTHONPATH (لیستی از نام دایرکتوری‌ها با قواعد مشابه متغیر پوسته PATH)
  • مسیر پیش‌فرض وابسته به نصب

فرض کن module_test.py در دایرکتوری /home/finca/ قرار داره و تو فایل calculation.py رو به /home/test/ منتقل کردی. تو می‌تونی sys.path رو طوری تغییر بدی که /home/test/ به لیست مسیرهایی اضافه بشه که مفسر پایتون در اون‌ها به دنبال ماژول می‌گرده. برای این کار باید module_test.py رو به این شکل تغییر بدی:

فایل‌های کامپایل شده به بایت در پایتون

ایمپورت کردن یک ماژول باعث افزایش زمان اجرای برنامه‌ها می‌شه، بنابراین پایتون ترفندهایی برای افزایش سرعت اون در نظر گرفته. یکی از راه‌ها ایجاد فایل‌های کامپایل شده به بایت با پسوند .pyc هست.

در لایه‌های درونی، پایتون کد منبع رو به یک فرم میانی به نام بایت‌کد (bytecode) تبدیل می‌کنه. سپس اون رو به زبان محلی کامپیوتر ترجمه می‌کنه و بعد اجراش می‌کنه. این فایل .pyc زمانی مفیده که می‌خوای ماژول رو دفعه بعد از یک برنامه دیگه ایمپورت کنی - در این حالت خیلی سریع‌تر می‌شه چون بخشی از پردازش لازم برای ایمپورت کردن ماژول از قبل انجام شده. به‌علاوه، این فایل‌های کامپایل شده مستقل از پلتفرم هستن.

توجه کن که این فایل‌های .pyc معمولاً در همون دایرکتوری ایجاد می‌شن که فایل‌های .py مرتبط قرار دارن. اگه پایتون دسترسی برای نوشتن روی فایل‌ها در اون دایرکتوری رو نداشته باشه، فایل‌های .pyc ساخته نمی‌شن. این فایل‌ها معمولاً در دایرکتوری __pycache__ در کنار فایل‌های .py با نام‌هایی مثل calculation.cpython-312.pyc  که نسخه پایتون استفاده شده رو نشون می‌دن. می‌تونی با خیال راحت نادیده‌اش بگیری یا .gitignore  کنی این پوشه رو. پایتون خودش به‌طور خودکار مدیریتش می‌کنه.

تابع ()dir در پایتون

از تابع dir() برای پیدا کردن تمام اسامی تعریف شده در یک ماژول استفاده می‌شه. این تابع یک لیست مرتب شده از رشته‌هایی که شامل اسامی تعریف شده در یک ماژول هستن رو برمی‌گردونه.

خروجی
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'add', 'sub']

در خروجی می‌تونی اسامی توابعی که در ماژول تعریف کردی، یعنی add و sub رو ببینی. ویژگی __name__ حاوی نام ماژول هست. تمام ویژگی‌هایی که با زیرخط شروع می‌شن، ویژگی‌های پیش‌فرض پایتون هستن که با یک ماژول مرتبط می‌شن.

نتیجه‌گیری

برای مدیریت بهتر کد و قابلیت استفاده مجدد، ساخت یک ماژول ضروریه. پایتون چندین ماژول داخلی بهت ارائه می‌ده که با کلمه کلیدی import می‌تونی اون‌ها رو ایمپورت کنی. پایتون همچنین این امکان رو می‌ده که ماژول‌های خودت رو بسازی و در برنامه‌هات استفاده کنی. فایل‌های کامپایل شده به بایت در اختیارت قرار می‌گیره تا هزینه استفاده از ماژول‌ها رو جبران کنه و اجرا رو سریع‌تر کنه. می‌تونی از dir() استفاده کنی تا متوجه بشی چه ویژگی‌هایی در ماژولِ در حال استفاده تعریف شده. از این مورد هم برای ماژول‌های از پیش تعریف شده و هم برای ماژول‌های تعریف شده توسط کاربر می‌شه استفاده کرد.

اگر دوست داری بیشتر درباره پایتون یاد بگیری، می‌تونی به دوره پایتون تکمیلی برای علم داده ما در فینکا نگاهی بندازی.

اشتراک‌گذاری
فهرست مطالب
  • ماژول‌های پایتون چی‌ان؟
  • ایمپورت کردن ماژول‌ها در پایتون
  • نحوه نوشتن ماژول‌های پایتون شخصی
  • روش‌های دیگه برای ایمپورت ماژول‌ها در پایتون
  • تغییر نام ماژول‌ها در پایتون
  • مسیر جستجوی ماژول در پایتون
  • فایل‌های کامپایل شده به بایت در پایتون
  • تابع ()dir در پایتون
  • نتیجه‌گیری

سوالات متداول در مورد ماژول‌ها در پایتون

بله. تو می‌تونی ماژول‌ها رو داخل توابع ایمپورت کنی، اما برای خوانایی و عملکرد بهتر، معمولاً بهتره که اون‌ها رو در بالای فایل ایمپورت کنی.

پایتون اولین ماژولی رو که در مسیر جستجوی ماژول پیدا کنه (sys.path) ایمپورت می‌کنه. هنگام نام‌گذاری دقت کن تا تداخلی پیش نیاد.

نه. وقتی یک ماژول رو ایمپورت می‌کنی، در صورتی که دسترسی نوشتن داشته باشی، پایتون به‌طور خودکار فایل‌های .pyc رو می‌سازه.

از ویژگی __file__ ماژول استفاده کن:

import math
print(math.__file__)

این روش کار می‌کنه اما در کدهای اصلی پروژه توصیه نمی‌شه. این کار می‌تونه فضای نام رو شلوغ کنه و پیگیری اینکه چه چیزهایی استفاده شدن رو سخت‌تر کنه.

بله، در یک نشست تعاملی، از importlib.reload() استفاده کن:

import importlib
import mymodule
importlib.reload(mymodule)

دریافت اپلیکیشن فینکا

با اپلیکیشن فینکا، به بیشتر دوره‌ها و مسیرها روی موبایل دسترسی دارید، تمرین می‌کنید و یادگیری رو هم‌زمان روی موبایل و دسکتاپ ادامه می‌دید.