पायथन शून्य वापसी प्रकार एनोटेशन


108

अजगर 3.x में, किसी फ़ंक्शन के रिटर्न प्रकार एनोटेशन का उपयोग करना आम है, जैसे:

def foo() -> str:
    return "bar"

"शून्य" प्रकार के लिए सही एनोटेशन क्या है?

मैं 3 विकल्पों पर विचार कर रहा हूं:

  1. def foo() -> None:
    • तार्किक IMO नहीं, क्योंकि Noneएक प्रकार नहीं है,
  2. def foo() -> type(None):
    • मुझे प्राप्त करने के लिए सबसे अच्छे वाक्यविन्यास का उपयोग करना NoneType,
  3. def foo():
    • स्पष्ट वापसी प्रकार जानकारी छोड़ें।

विकल्प 2. मुझे सबसे तार्किक लगता है, लेकिन मैंने पहले से ही 1 के कुछ उदाहरण देखे हैं।


11
एफडब्ल्यूआईडब्ल्यू, पायथन में voidरिटर्न प्रकार के कार्य नहीं हैं । कोई भी फ़ंक्शन (या किसी फ़ंक्शन में शाखा) बिना किसी स्पष्ट के returnवापस आ जाएगी None। मुझे लगता है कि ओपी समझता है कि, यह टिप्पणी ज्यादातर भविष्य के पाठकों के लाभ के लिए है ...
PM 2Ring

खैर, यह सवाल उतना लोकप्रिय नहीं है कि "पायथन में मेरा फंक्शन कोई भी क्यों नहीं लौटाता है?" (मैंने यह सवाल किया है), इसलिए शायद अधिकांश पाठक पहले से ही डिफ़ॉल्ट व्यवहार जानते हैं। दुविधा 1 बनाम 2 जवाब में हल किया जाता है। लेकिन 3 का क्या? "प्रक्रियाओं" के लिए मैं वास्तव में विकल्प 3 पसंद करूंगा, बेकार अव्यवस्था के बिना (आखिरकार, यह फ़ंक्शन कुछ भी वापस नहीं करता है)।
टॉमस गैंडर

@ टॉमाज़गैंडर सहमत। जब किसी फ़ंक्शन या विधि में कोई रिटर्न स्टेटमेंट नहीं होता है, तो इसके रिटर्न प्रकार को निर्दिष्ट करने की आवश्यकता नहीं होती है।
ज्येकोमन

जवाबों:


121

यह PEP 484 से सीधे है - टाइप संकेत प्रलेखन:

जब एक प्रकार के संकेत में उपयोग किया जाता है, तो अभिव्यक्ति Noneको इसके बराबर माना जाता है type(None)

और, जैसा कि आप देख सकते हैं कि अधिकांश उदाहरण Noneरिटर्न प्रकार के रूप में उपयोग होते हैं।


22
स्पष्ट करने के लिए, ऊपर 1 विकल्प चुनें।
एडम नेल्सन

6
NoReturn प्रकार के बारे में क्या python.org/dev/peps/pep-0484/#the-noreturn-type ?
अस्माइर

12
इस सवाल के अनुसार @masaier जो PEP 484 का हवाला देता है - टाइप संकेतNoReturn प्रकार का उपयोग किया जाता है "... उन कार्यों को एनोटेट करने के लिए जो कभी भी सामान्य रूप से वापस नहीं आते हैं। उदाहरण के लिए, एक फ़ंक्शन जो बिना शर्त अपवाद उठाता है ..."
रोड्रिगो लागुना

37

TLDR: एक voidरिटर्न प्रकार एनोटेशन के मुहावरेदार बराबर है -> None

def foo() -> None:
    ...

यह मेल खाता है कि बिना returnया सिर्फ नंगे एक फ़ंक्शन का returnमूल्यांकन करता है None

def void_func():  # unannotated void function
    pass

print(void())  # None

रिटर्न प्रकार को स्वीकार करने का मतलब यह नहीं है कि रिटर्न वैल्यू नहीं है। पीईपी 484 के अनुसार :

चेक किए गए फ़ंक्शन के लिए, तर्कों के लिए डिफ़ॉल्ट एनोटेशन और वापसी प्रकार के लिए है Any

इसका मतलब है कि मूल्य को गतिशील रूप से टाइप किया गया है और सांख्यिकीय रूप से किसी भी ऑपरेशन का समर्थन करता है । व्यावहारिक रूप से इसका विपरीत अर्थ है void


पाइथन में टाइप करने के लिए वास्तविक प्रकारों की कड़ाई से आवश्यकता नहीं होती है। उदाहरण के लिए, एनोटेशन प्रकार के नाम के तार का उपयोग कर सकते हैं: Union[str, int], Union[str, 'int'], 'Union[str, int]'और विभिन्न वेरिएंट बराबर हैं।

इसी प्रकार, एनोटेशन Noneका अर्थ "का है " माना जाता हैNoneType । यह न केवल रिटर्न प्रकारों के लिए उपयोग किया जा सकता है, हालांकि आप इसे वहां सबसे अधिक बार देखेंगे:

bar : None

def foo(baz: None) -> None:
    return None

यह सामान्य प्रकारों पर भी लागू होता है। उदाहरण के लिए, आप उपयोग कर सकते हैं Noneमें Generator[int, None, None]एक जनरेटर लेने के लिए या मान वापस नहीं करता है इंगित करने के लिए।


भले ही पीईपी 484 का Noneअर्थ है कि type(None)आपको बाद के फॉर्म का स्पष्ट रूप से उपयोग नहीं करना चाहिए । प्रकार संकेत विनिर्देश के किसी भी रूप में शामिल नहीं है type(...)। यह तकनीकी रूप से एक रनटाइम अभिव्यक्ति है, और इसका समर्थन पूरी तरह से टाइप चेकर तक है। mypyपरियोजना है समर्थन को दूर करने पर विचार के लिए type(None)और साथ ही 484 से निकाल देंगे।

या हो सकता है कि हमें PEP 484 को अपडेट करना चाहिए ताकि यह सुझाव न दिया जा सके कि type(None)यह एक प्रकार के रूप में मान्य है, और Noneकेवल सही वर्तनी है? एक होना चाहिए - और अधिमानतः केवल एक - स्पष्ट तरीका यह करने के लिए आदि।

--- जुक्काएल, 18 मई 2018


4
तीसरा विकल्प वास्तव में शून्य कार्य क्यों नहीं है यह समझाने के लिए विशाल चिल्लाया।
никта
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.