ذخیره کردن تابع‌ها در ماژول‌ها

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

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

چندین راه برای وارد کردن یک ماژول وجود دارد که هر کدام از آن‌ها به طور مختصر معرّفی می‌شود.

وارد کردن یک ماژول کامل

برای آغاز وارد کردن تابع‌ها، نیاز دارید ابتدا یک ماژول بسازید. یک ماژول فایلی با پسوند .py است و کدی را شامل می‌شود که می‌خواهید به برنامه‌ی خود وارد کنید. اکنون ماژولی می‌سازیم که حاوی تابع make_pizza() است. برای ساختن این ماژول همه‌چیز را به جز این تابع، از فایل pizza.py حذف می‌کنیم:

1
2
3
4
5
def make_pizza(size, *toppings):
    """Summarize the pizza we are about to make."""
    print(f"\nMaking a {size}-inch pizza with the following toppings:")
    for topping in toppings:
        print(f"- {topping}")

حال فایلی جداگانه به نام making_pizza.py در همان جایی که pizza.py را ذخیره کرده‌ایم می‌سازیم. این فایل ماژولی را که اکنون ساخته‌ایم وارد کرده و تابع make_pizza() را دوبار فراخوانی می‌کند.

1
2
3
4
import pizza

pizza.make_pizza(16, 'pepperoni')
pizza.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')

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

برای فراخوانی تابعی از یک ماژولِ واردشده، نام ماژول را، در اینجا pizza، و پس از آن نام تابع را، در اینجا make_pizza() بنویسید و بین این دو یک نقطه قرار دهید (۱). خروجی این کد و برنامه‌ی اصلی که ماژولی را وارد نمی‌کرد، یکسان است:

1
2
3
4
5
6
7
Making a 16-inch pizza with the following toppings:
- pepperoni

Making a 12-inch pizza with the following toppings:
- mushrooms
- green peppers
- extra cheese

اوّلین رویکرد برای وارد کردن، که در آن به سادگی دستور import و نام ماژول را پس از آن می‌نویسید، تمام تابع‌های موجود در ماژول در برنامه‌ی شما در اختیار قرار می‌دهد. اگر این نوع import برای وارد کردن کامل یک ماژول به نام module_name.py استفاده کنید، هر تابع این ماژول از طریق دستور زیر در دسترس است:

1
module_name.function_name()

وارد کردن تابع‌های مشخّص

در عین حال می‌توانید تنها تابع خاصّی را از یک ماژول وارد کنید. این دستورِ کلی برای چنین رویکردی است:

1
from module_name import function_name

می‌توانید هر تعداد تابع را که خواستید از یک ماژول وارد کنید. برای این کار نام هر تابع را با یک کاما جدا کنید:

1
from module_name import function_0, function_1, function_2

اگر بخواهید تنها تابعی را که مورد نیاز است وارد کنیم، مثال making_pizzas.py به شکل زیر درمی‌آید:

1
2
3
4
from pizza import make_pizza

make_pizza(16, 'pepperoni')
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')

با این دستور دیگر نیازی به استفاده از نقطه برای فراخوانی تابع ندارید. می‌توانیم هنگام استفاده از تابع آن را با نام فراخوانی کنیم، زیرا تابع make_pizza() را به طور صریح در عبارت import وارد کرده‌ایم.

استفاده از as برای تعیین نام مستعار 78 برای تابع

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

در اینجا با وارد کردنِ ماژول به صورت make_pizza as mp، به تابع make_pizza() نام مستعار mp() می‌دهیم. کلیدواژه‌ی as نام تابع را به نام مستعاری که تعیین کرده‌اید تغییر می‌دهد:

1
2
3
4
from pizza import make_pizza as mp

mp(16, 'pepperoni')
mp(12, 'mushrooms', 'green peppers', 'extra cheese')

عبارت import که اینجا نمایش داده شده نام تابع make_pizza() را در این برنامه به mp() تغییر می‌دهد. هر زمان که بخواهید می‌توانید برای فراخوانی به جای make_pizza() از mp() استفاده کنید و پایتون کد make_pizza() را اجرا خواهد کرد بدون این که با تابع make_pizza() دیگری که احتمالاً در برنامه‌ی خود تعریف کرده‌اید، هیچ گونه تداخلی به وجود بیاید.

دستور عمومی برای ارائه کردن نام مستعار به این صورت است:

1
from module_name import function_name as fn

استفاده از as برای تعیین نام مستعار برای یک ماژول

شما همچنین می‌توانید برای یک ماژول نام مستعار بگذارید. تعیین یک نام مستعار کوتاه، مانند p به جای pizza، باعث می‌شود که فراخوانی تابع‌های آن ماژول سریع‌تر انجام گیرد. فراخوانی p.make_pizza() بسیار خلاصه‌تر از pizza.make_pizza() است:

1
2
3
4
import pizza as p

p.make_pizza(16, 'pepperoni')
p.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')

در عبارت import به ماژول pizza نام مستعار p داده‌ایم، امّا تابع‌های ماژول نام‌های اصلی خود را حفظ می‌کنند. فراخواندن تابع‌ها با نوشتن p.make_pizza() به جای pizza.make_pizza() نه تنها مختصرتر است بلکه توجّه شما از نام ماژول برمی‌گرداند و امکان می‌دهد که روی نام‌های گویای تابع‌های آن تمرکز کنید. نام این تابع‌ها به وضوح به شما می‌گویند که این تابع چه می‌کند و به‌کارگیری آن‌ها نسبت به به‌کارگیری نام کامل ماژول، برای خوانایی برنامه‌ی شما اهمّیّت بیشتری دارند.

دستور کلّی برای این رویکرد این است:

1
import module_name as mn

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

با استفاده از عملگر ستاره (*) می‌توانید از پایتون بخواهید که تمام تابع‌های یک ماژول را وارد کند:

1
2
3
4
from pizza import *

make_pizza(16, 'pepperoni')
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')

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

بهترین رویکرد این است که تنها تابع یا توابعی را که می‌خواهید وارد کنید یا تمام ماژول را وارد کرده و از علامت نقطه استفاده کنید. این کار به کدی واضح منجر می‌شود که خواندن و درک کردن آن ساده است. این بخش از این جهت در اینجا آمده تا اگر به عبارت‌های import مانند این در کد دیگران برخوردید، بتوانید آن را تشخیص دهید:

1
from module_name import *