توابع 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 بر اساس تعریف اصلی است و باید مراقب تغییرات بود.