कई प्रकार के वापसी मूल्यों को कैसे एनोटेट करें?


110

किसी फ़ंक्शन को एनोटेट करने के लिए मैं किस प्रकार के संकेत का उपयोग करता हूं जो एक रिटर्न देता है Iterableजो हमेशा दो मान देता है: ए boolऔर ए str? संकेत Tuple[bool, str]करीब है, सिवाय इसके कि यह एक ट्यूपल पर वापसी मूल्य प्रकार को सीमित करता है, न कि जनरेटर या अन्य प्रकार के चलने योग्य।

मैं ज्यादातर उत्सुक हूं क्योंकि मैं एक फ़ंक्शन को एनोटेट करना चाहूंगा foo()जिसका उपयोग इस तरह से कई मानों को वापस करने के लिए किया जाता है:

always_a_bool, always_a_str = foo()

आमतौर पर फ़ंक्शंस foo()कुछ ऐसा करते हैं जैसे return a, b(जो एक टुपल लौटाता है), लेकिन मैं चाहूंगा कि टाइप्ड हिंट पर्याप्त लचीला हो ताकि लौटे हुए टपल को जनरेटर या लिस्ट या किसी और चीज़ से बदला जा सके।



3
@ StevenM.Vascellaro यह उस प्रश्न का एक डुप्लिकेट नहीं है
TWR कोल

जवाबों:


159

आप हमेशा एक वस्तु वापस कर रहे हैं ; return one, twoबस एक टपल का उपयोग करके ।

तो हाँ, -> Tuple[bool, str]पूरी तरह से सही है।

केवलTuple प्रकार आप एक निर्दिष्ट कर सकते हैं निश्चित संख्या एक अलग प्रकार के साथ तत्वों की, प्रत्येक। आपको वास्तव में एक टपल लौटाया जाना चाहिए, हमेशा, यदि आपका फ़ंक्शन एक निश्चित संख्या में रिटर्न मान उत्पन्न करता है , खासकर जब वे मान विशिष्ट, विशिष्ट प्रकार होते हैं।

अन्य अनुक्रम प्रकारों से तत्वों की एक चर संख्या के लिए एक प्रकार के विनिर्देशन की अपेक्षा की जाती है, इसलिए typing.Sequenceयहां उपयुक्त नहीं है। यह भी देखें कि सूचियों और टुपल्स के बीच अंतर क्या है?

ट्यूप्स विषम डेटा संरचनाएं हैं (यानी, उनकी प्रविष्टियों के अलग-अलग अर्थ हैं), जबकि सूचियां सजातीय अनुक्रम हैं। ट्यूपल्स में संरचना होती है, सूचियों का क्रम होता है।

पायथन का प्रकार संकेत प्रणाली उस दर्शन का पालन करता है, वर्तमान में निश्चित लंबाई के चलने योग्य और विशिष्ट पदों पर विशिष्ट प्रकारों को निर्दिष्ट करने के लिए कोई वाक्यविन्यास नहीं है।

यदि आपको यह निर्दिष्ट करना होगा कि कोई भी चलने योग्य है, तो आप जो सबसे अच्छा कर सकते हैं वह है:

-> Iterable[Union[bool, str]]

किस बिंदु पर कॉलर किसी भी क्रम में बूलियन और स्ट्रिंग्स की उम्मीद कर सकता है , और अज्ञात लंबाई (0 और अनंत के बीच कहीं भी)।


2
भाषा विनिर्देश अन्य iterables लौटने की अनुमति देता है; foo()कर सकता था yield True; yield "blah"और a, b = foo()अब भी काम करेगा। या foo()एक सूची वापस कर सकता है। मैंने अपना प्रश्न फिर से स्पष्ट कर दिया कि मैं एक मनमाना चलने में रुचि रखने में दिलचस्पी रखता हूं, न कि एक तुगलकी।
रिचर्ड हैनसेन

2
@ रीचर्डहेनसेन: मैंने पोस्ट करने के बाद से पीईपी और प्रलेखन typingऔर mypyदूसरी बार 2 बार जांच की है; मुझे पूरा विश्वास है कि मुझे कुछ भी याद नहीं था। उस ने कहा, बहुत से पायथन टाइप हिन्टिंग अनुभव वाले SO पर यहाँ कई नियमित हैं जो गलत होने पर मुझे सही करने में संकोच नहीं करेंगे, या बेहतर उत्तर देंगे।
मार्टिन पीटर्स

21
मुझे काम करने from typing import Tupleके लिए टूप्ले एनोटेशन के लिए जोड़ना था ।
PHPirate

3
@PHPirate: हाँ, और आप के लिए भी ऐसा ही करना होगा Iterableऔर Union। चूंकि हम यहां उनके विशिष्ट उपयोग पर चर्चा कर रहे हैं, इसलिए आयात निहित है।
मार्टिजन पीटरर्स

6
@MartijnPieters, एक महान जवाब के लिए धन्यवाद, लेकिन मुझे लगता है कि PHPirate की टिप्पणी आपके मूल उत्तर में संपादन के लायक है।
टिम मिरोनोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.