में ओवरलोडिंग के लिए सजावटी मुझे पता है कि यह तर्कों के प्रकार की देखभाल करने वाले कार्यों को लिखने के लिए पाइथोनिक नहीं है, लेकिन ऐसे मामले हैं जब प्रकारों को अनदेखा करना असंभव है क्योंकि उन्हें अलग-अलग संभाला जाता है।पाइथन
isinstance
का एक गुच्छा होने के कारण आपके काम में केवल बदसूरत है; क्या कोई फ़ंक्शन सजावट उपलब्ध है जो फ़ंक्शन ओवरलोड को सक्षम बनाता है? कुछ इस तरह:
@overload(str)
def func(val):
print('This is a string')
@overload(int)
def func(val):
print('This is an int')
अद्यतन:
यहाँ कुछ टिप्पणियों मैं David Zaslavsky's answer पर छोड़ दिया है:
में कुछ संशोधन [एस] के साथ, यह मेरा प्रयोजनों सुंदर सूट कुंआ। आपके कार्यान्वयन में मैंने एक और सीमा देखी, चूंकि आप
func.__name__
को कुंजीपटल कुंजी के रूप में उपयोग करते हैं, तो आप मॉड्यूल के बीच टकराव नाम देने के लिए प्रवण होते हैं, जो हमेशा वांछनीय नहीं होता है। [जारी][शेष भाग।] उदाहरण के लिए, अगर मैं एक मॉड्यूल है कि
func
overloads, और एक अन्य पूरी तरह से असंबंधित मॉड्यूल भी overloadsfunc
है, ये भार के भिड़ना होगा क्योंकि समारोह प्रेषण dict वैश्विक है। उस निर्देश को किसी भी तरह मॉड्यूल के लिए स्थानीय बनाया जाना चाहिए। और न केवल वह, इसे किसी प्रकार की 'विरासत' का भी समर्थन करना चाहिए। [cont'd][cont।] 'विरासत' से मेरा मतलब यह है: कहें कि मेरे पास कुछ ओवरलोड के साथ मॉड्यूल
first
है। फिर दो और मॉड्यूल जो असंबंधित हैं लेकिन प्रत्येक आयातfirst
; इन दोनों मॉड्यूल में पहले से मौजूद मौजूदा लोगों को नए अधिभार जोड़ते हैं जिन्हें उन्होंने अभी आयात किया था। ये दो मॉड्यूलfirst
में ओवरलोड का उपयोग करने में सक्षम होना चाहिए, लेकिन जो नए वे अभी जोड़े गए हैं उन्हें मॉड्यूल के बीच एक दूसरे के साथ टकराव नहीं करना चाहिए। (यह सही करने के लिए, अब मैं इसके बारे में लगता है कि वास्तव में बहुत मुश्किल है।)
इन समस्याओं में से कुछ संभवतः डेकोरेटर वाक्य रचना एक छोटा सा बदलकर हल किया जा सकता:
first.py
@overload(str, str)
def concatenate(a, b):
return a + b
@concatenate.overload(int, int)
def concatenate(a, b):
return str(a) + str(b)
second.py
from first import concatenate
@concatenate.overload(float, str)
def concatenate(a, b):
return str(a) + b
हम्म ... अपने संपादन में ऐसा है, तो वास्तव में क्या आप '' first.py' में contatenate.overload' द्वारा मतलब है? जैसा लिखा है, यह 'concatenate' फ़ंक्शन' की 'अधिभार' विशेषता तक पहुंचने का प्रयास करेगा, जो इस उदाहरण में मौजूद नहीं है। –
@DavidZaslavsky समारोह के पहले अधिभार 'साथ @ overload' है, जो एक प्रतिदेय वस्तु है कि लौटने और विशेषता' overload' जाएगा सजाया जाना चाहिए। बाद के सभी भार के इस पहले से ही विद्यमान वस्तु, '@ object.overload' के साथ सजाया जाना चाहिए, इसलिए वहाँ वस्तु में केवल एक dict, नहीं एक वैश्विक dict है। (यह मानक '@ प्रॉपर्टी 'के समान काम करता है।) मैं इसे कार्यान्वित करता हूं और इसे पोस्ट करते समय आपको सूचित करता हूं। –
यह पारंपरिक ओवरलोडिंग वाक्यविन्यास से प्रस्थान होगा। लेकिन अगर है कि तुम क्या चाहते हो, [अधिभार पैकेज] पर एक नज़र (http://pypi.python.org/pypi/overload/1 है।1) (जो मैं अपने जवाब में संपादित करने वाला हूं)। यह अनिवार्य रूप से उस विधि का उपयोग करता है। –