मैं एक अच्छी जगह प्रतिदेय वस्तुओं का उपयोग करने के लिए, उन है कि परिभाषित __call__()
, जब अजगर में कार्यात्मक प्रोग्रामिंग क्षमताओं का उपयोग, जैसे है map()
, filter()
, reduce()
।
किसी सादे फ़ंक्शन या लंबो फ़ंक्शन पर कॉल करने योग्य ऑब्जेक्ट का उपयोग करने का सबसे अच्छा समय तब होता है जब तर्क जटिल होता है और कुछ स्थिति को बनाए रखने की आवश्यकता होती है या __call__()
फ़ंक्शन में पारित नहीं होने पर अन्य जानकारी का उपयोग करने की आवश्यकता होती है।
यहाँ कुछ कोड है जो फ़ाइल नाम को उनके फ़ाइल एक्सटेंशन के आधार पर कॉल करने योग्य ऑब्जेक्ट का उपयोग करके फ़िल्टर करता है और filter()
।
प्रतिदेय:
import os
class FileAcceptor(object):
def __init__(self, accepted_extensions):
self.accepted_extensions = accepted_extensions
def __call__(self, filename):
base, ext = os.path.splitext(filename)
return ext in self.accepted_extensions
class ImageFileAcceptor(FileAcceptor):
def __init__(self):
image_extensions = ('.jpg', '.jpeg', '.gif', '.bmp')
super(ImageFileAcceptor, self).__init__(image_extensions)
उपयोग:
filenames = [
'me.jpg',
'me.txt',
'friend1.jpg',
'friend2.bmp',
'you.jpeg',
'you.xml']
acceptor = ImageFileAcceptor()
image_filenames = filter(acceptor, filenames)
print image_filenames
आउटपुट:
['me.jpg', 'friend1.jpg', 'friend2.bmp', 'you.jpeg']