2012-02-10 9 views
5

मुझे क्या करना चाहते हैं के मूल विचार है:एक ही फ़ंक्शन के लिए अलग-अलग इनपुट प्रकार कैसे हैं?

def aFuncion(string = '', dicti = {}): 
    if len(str) > 0: 
     print 'you gave string as input' 
    if len(dicti) > 0: 
     print 'you gave a dict as input' 

aFunction(string = 'test') 
dict['test'] = test 
aFunction(dicti = dict) 

मैं विचार इस तरह का पता भाषाओं के अधिक OO प्रकार में संभव है, लेकिन यह अजगर में भी संभव है?

अभी मैं

def aFuncion(input): 
    if type(input) == str: 
     print 'you gave string as input' 
    if type(input) == dict: 
     print 'you gave a dict as input' 

aFunction('test') 

कर रहा हूँ लेकिन मैं जब समारोह

उत्तर

3

"लक्ष्य कहने पर अंतर स्पष्ट होना" चाहते हैं, यह लक्ष्य भाषा के डिजाइन दर्शन के साथ इतना अच्छा नहीं है। इसके बारे में अधिक जानकारी के लिए Google "बतख टाइपिंग"। स्वीकार किए गए इनपुट को फ़ंक्शन के डॉकस्ट्रिंग द्वारा स्पष्ट किया जाना चाहिए, और आपको बस इतना करना है।

पायथन में, जब आप अपना इनपुट चाहते हैं तो यह एक स्ट्रिंग या एक धक्का हो, तो आप केवल कोड लिखते हैं जो मानता है कि इनपुट एक ऐसी वस्तु होगी जो एक स्ट्रिंग-जैसी तरीके या एक धैर्य जैसा व्यवहार में व्यवहार करे । यदि इनपुट नहीं करता है, तो आप चाहें तो उस शानदार तरीके से इसे संभालने का प्रयास कर सकते हैं, लेकिन आमतौर पर आप आसानी से एक अनचाहे अपवाद के साथ पॉप करने के लिए अपना कोड छोड़ सकते हैं। यह गेंद को कॉलर की अदालत में वापस रखता है ताकि यह तय किया जा सके कि स्थिति को कैसे संभाला जाए, या महसूस हो कि वे खराब डेटा में भेज रहे थे।

टाइप चेक सामान्य रूप से टालना चाहिए, यदि वास्तव में आवश्यक है तो इसे आपके द्वारा किए गए प्रकार की समानता जांच के बजाय isinstance के साथ किया जाना चाहिए। विरासत स्थितियों के लिए यह अधिक लचीला होने का लाभ है।

def aFuncion(input_): 
    if isinstance(input_, str): 
     print 'you gave a string-like input' 
    elif isinstance(input_, dict): 
     print 'you gave a dict-like input' 

aFunction('test') 

पायथन 3 में अब आपके पास टाइपिंग फ़ंक्शन एनोटेशन का उपयोग करने का एक और विकल्प है। उस सुविधा के बारे में अधिक जानकारी के लिए PEP 484 पढ़ें।

+0

+1 भाषा दर्शन के बारे में अच्छा बिंदु। प्लस मेरा मानना ​​है कि आप 'input' तर्क का नाम बदलना चाहिए (अब यह एक अंतर्निहित समारोह अधिलेखित करता है)। – Tadeck

6

एक ही विधि का समर्थन अलग तर्क प्रकारों multiple dispatch or multimethods रूप में जाना जाता करने का विचार भी कहा जाता है अंतर स्पष्ट होना चाहता हूँ।

इसके लिए एक अच्छा परिचय प्राप्त करने के लिए, आप इस Guido Van Rossum article पढ़ सकते हैं और कुछ multimethod packages उपलब्ध होने के बाद से पीपीआई पर एक नज़र डालें।

+0

धन्यवाद, मैं नाम (बहुरूपता देख रहा था) की मदद करनी चाहिए कि –

0

जो आपने मूल रूप से काम किया है, वैरिएबल घोषणाओं के साथ कुछ परेशानी है।

def aFunction(str = '', dicti = {}): 
    if len(str) > 0: 
     print 'you gave string as input' 
    if len(dicti) > 0: 
     print 'you gave a dict as input' 

str = 'test' 
dicti = dict([('test', 'test')]) 
aFunction(str = str) 
aFunction(dicti = dicti) 
aFunction(str = str, dicti = dicti) 
aFunction(dicti = dicti, str = str) 

कहते हैं::

you gave string as input 
you gave a dict as input 
you gave string as input 
you gave a dict as input 
you gave string as input 
you gave a dict as input 

तुम भी गैर विशिष्ट तर्क है कि दोनों एक सूची है और एक शब्दकोश (उदाहरण के लिए What is a clean, pythonic way to have multiple constructors in Python? देखें) के रूप में कार्य करने के लिए भेजा जाता है हो सकता है यहाँ एक काम कर vesrion है।

+0

आपका जवाब गलत है नहीं पता था। तुम अब भी 'aFunction' कॉल कर सकते हैं साथ:' aFunction ([1,2,3]) 'और यह मानते हुए किया जाएगा कि आप इसे एक स्ट्रिंग दे दी है (जो स्पष्ट रूप से मामला नहीं है) और साथ ही' aFunction (dicti = " यह एक ताना नहीं है ") और यह मान लेगा कि आपने एक निर्देश दिया है। @ डिम को बतख टाइपिंग का उपयोग करके सही जवाब मिला। एक दिया प्रकार के एक डिफ़ॉल्ट तर्क सौंपते समय, आप, गारंटी नहीं देंगे क्योंकि अजगर एक कमजोर टाइप किया भाषा है और यह क्रम बदल सकते हैं। –

संबंधित मुद्दे