পার্টিয়াল অবিশ্বাস্যভাবে দরকারী।
উদাহরণস্বরূপ, একটি 'পাইপ-রেখাযুক্ত' ফাংশন কলগুলির ক্রম (যার মধ্যে একটি ফাংশন থেকে প্রত্যাশিত মানটি পরের দিকে প্রেরণ করা আর্গুমেন্ট)।
কখনও কখনও এই ধরনের একটি পাইপলাইন একটি ফাংশন একটি প্রয়োজন একক যুক্তি , কিন্তু ফাংশন অবিলম্বে মূল প্রজেক্টের এটা ফেরৎ থেকে দুটি মানের ।
এই পরিস্থিতিতে, functools.partial
আপনি এই ফাংশন পাইপলাইন অক্ষত রাখতে পারবেন।
এখানে একটি সুনির্দিষ্ট, বিচ্ছিন্ন উদাহরণ রয়েছে: ধরুন আপনি কিছু লক্ষ্য থেকে প্রতিটি ডেটার পয়েন্টের দূরত্বের মাধ্যমে কিছু ডেটা বাছাই করতে চান:
# create some data
import random as RND
fnx = lambda: RND.randint(0, 10)
data = [ (fnx(), fnx()) for c in range(10) ]
target = (2, 4)
import math
def euclid_dist(v1, v2):
x1, y1 = v1
x2, y2 = v2
return math.sqrt((x2 - x1)**2 + (y2 - y1)**2)
লক্ষ্য থেকে দূরত্বে এই ডেটা সাজানোর জন্য আপনি অবশ্যই যা করতে চান তা হ'ল:
data.sort(key=euclid_dist)
তবে আপনি পারবেন না - বাছাই পদ্ধতির কী পরামিতি কেবল এমন ফাংশন গ্রহণ করে যা একক যুক্তি গ্রহণ করে ।
সুতরাং euclid_dist
একটি একক প্যারামিটার গ্রহণ করে একটি ফাংশন হিসাবে আবার লিখুন :
from functools import partial
p_euclid_dist = partial(euclid_dist, target)
p_euclid_dist
এখন একক যুক্তি গ্রহণ করে,
>>> p_euclid_dist((3, 3))
1.4142135623730951
সুতরাং এখন আপনি বাছাই পদ্ধতির মূল যুক্তির জন্য আংশিক ফাংশন পেরিয়ে আপনার ডেটা বাছাই করতে পারেন:
data.sort(key=p_euclid_dist)
# verify that it works:
for p in data:
print(round(p_euclid_dist(p), 3))
1.0
2.236
2.236
3.606
4.243
5.0
5.831
6.325
7.071
8.602
বা উদাহরণস্বরূপ, ফাংশনটির একটি আর্গুমেন্ট বাইরের লুপে পরিবর্তিত হয় তবে অভ্যন্তরীণ লুপে পুনরাবৃত্তির সময় এটি স্থির হয়। আংশিক ব্যবহার করে, আপনাকে অভ্যন্তরীণ লুপটির পুনরাবৃত্তির সময় অতিরিক্ত প্যারামিটারটি পাস করতে হবে না, কারণ পরিবর্তিত (আংশিক) ফাংশনটির প্রয়োজন হয় না।
>>> from functools import partial
>>> def fnx(a, b, c):
return a + b + c
>>> fnx(3, 4, 5)
12
একটি আংশিক ফাংশন তৈরি করুন (কীওয়ার্ড আরগ ব্যবহার করে)
>>> pfnx = partial(fnx, a=12)
>>> pfnx(b=4, c=5)
21
আপনি একটি স্থিতিক যুক্তি দিয়ে একটি আংশিক ফাংশন তৈরি করতে পারেন
>>> pfnx = partial(fnx, 12)
>>> pfnx(4, 5)
21
তবে এটি নিক্ষেপ করবে (উদাঃ, কীওয়ার্ড আর্গুমেন্টের সাথে আংশিক তৈরি করার পরে অবস্থানগত আর্গুমেন্ট ব্যবহার করে কল করা)
>>> pfnx = partial(fnx, a=12)
>>> pfnx(4, 5)
Traceback (most recent call last):
File "<pyshell#80>", line 1, in <module>
pfnx(4, 5)
TypeError: fnx() got multiple values for keyword argument 'a'
আরেকটি ব্যবহারের ক্ষেত্রে: পাইথনের multiprocessing
লাইব্রেরি ব্যবহার করে বিতরণ কোড লেখা writing পুল পদ্ধতি ব্যবহার করে একটি পুলের প্রক্রিয়া তৈরি করা হয়:
>>> import multiprocessing as MP
>>> # create a process pool:
>>> ppool = MP.Pool()
Pool
মানচিত্রের পদ্ধতি রয়েছে তবে এটি কেবল একক পুনরাবৃত্তিযোগ্য লাগে, সুতরাং আপনাকে যদি দীর্ঘ পরামিতি তালিকার কোনও ফাংশনে পাস করার প্রয়োজন হয় তবে একটি ব্যতীত সমস্ত কিছু ঠিক করার জন্য আংশিক হিসাবে ফাংশনটিকে পুনরায় সংজ্ঞায়িত করুন:
>>> ppool.map(pfnx, [4, 6, 7, 8])
extra_args
ভেরিয়েবলটি কোথা থেকে