توابع Partial در پایتون با functools.partial
گاهی اوقات میخواهیم تابعی جدید بسازیم که بخشی از پارامترهای یک تابع دیگر را از پیش تعیین کرده باشد. این کار به ما اجازه میدهد تا توابع سفارشیتر و سادهتر بسازیم بدون نیاز به نوشتن دوبارهی کل تابع. در پایتون، این کار با استفاده از functools.partial به سادگی انجام میشود.
تعریف و عملکرد functools.partial
تابع partial یک نسخه جدید از تابع اصلی ایجاد میکند که برخی از آرگومانهای آن قبلاً مقداردهی شدهاند. این نسخه جدید مانند یک تابع معمولی فراخوانی میشود، اما نیازی به وارد کردن همهی پارامترها نیست.
مثال ساده
from functools import partial
def multiply(x, y):
return x * y
# ساخت تابع جدید که y برابر 2 دارد
double = partial(multiply, y=2)
print(double(5)) # خروجی: 10
در این مثال:
- تابع اصلی
multiplyدو عدد را ضرب میکند. - با
partialیک تابع جدیدdoubleساختیم که همیشه مقدارyبرابر 2 دارد. - وقتی
double(5)فراخوانی میشود، در واقعmultiply(5, 2)اجرا میشود.
چرا partial کاربردی است؟
- اگر یک تابع بزرگ و پیچیده داشته باشیم و در شرایط خاص بخواهیم یک نسخه سفارشی با پارامترهای ثابت بسازیم.
- در برنامهنویسی تابعی (functional programming)، برای سادهسازی کدها و بازاستفاده بیشتر.
- در کتابخانههایی که به عنوان callback یا handler استفاده میشوند و نیاز به پارامترهای از پیش تعیین شده دارند.
مثال کاربردیتر
def greet(name, greeting="Hello"):
return f"{greeting}, {name}!"
say_hello = partial(greet, greeting="Hello")
say_hi = partial(greet, greeting="Hi")
print(say_hello("Ali")) # خروجی: Hello, Ali!
print(say_hi("Sara")) # خروجی: Hi, Sara!
در این مثال:
- با استفاده از
partialدو تابع جدید ساختیم که پیشفرضgreetingآنها متفاوت است. - نیازی نیست هر بار
greetingرا وارد کنیم، فقط نام را میدهیم.
نکات مهم
- آرگومانهایی که در
partialتعیین میشوند، هم میتوانند به صورت موقعیتی (positional) و هم کلیدی (keyword) باشند. - پارامترهایی که در هنگام فراخوانی نسخه partial داده نشوند، باید در آرگومانهای جدید مشخص شوند.
partialخودش یک callable است و میتواند به عنوان ورودی به توابع دیگر داده شود.- اگر پارامترهای اصلی تابع تغییر کنند، نسخه partial بر اساس تعریف اصلی است و باید مراقب تغییرات بود.