partials अविश्वसनीय रूप से उपयोगी हैं।
उदाहरण के लिए, फ़ंक्शन कॉल के 'पाइप-लाइन किए गए' क्रम में (जिसमें किसी फ़ंक्शन से लौटाया गया मान तर्क अगले में पास हो जाता है)।
कभी-कभी इस तरह के पाइपलाइन में एक फ़ंक्शन को एक एकल तर्क की आवश्यकता होती है , लेकिन इसके तुरंत बाद का फ़ंक्शन दो मान देता है ।
इस परिदृश्य में, 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
आंशिक फ़ंक्शन बनाएं (कीवर्ड arg का उपयोग करके)
>>> 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
पुस्तकालय का उपयोग करके वितरित कोड लिखना । पूल विधि का उपयोग करके प्रक्रियाओं का एक पूल बनाया जाता है:
>>> import multiprocessing as MP
>>> # create a process pool:
>>> ppool = MP.Pool()
Pool
एक नक्शा विधि है, लेकिन इसमें केवल एक ही पुनरावृत्ति होती है, इसलिए यदि आपको एक लंबी पैरामीटर सूची वाले फ़ंक्शन में पास होने की आवश्यकता है, तो फ़ंक्शन को आंशिक के रूप में फिर से परिभाषित करें, लेकिन सभी को ठीक करने के लिए:
>>> ppool.map(pfnx, [4, 6, 7, 8])
extra_args
चर