2016-07-25 13 views
12

अजगर की नई type hinting को हमें यह टाइप करने के लिए संकेत एक फ़ंक्शन कि None की अनुमति देता है ...प्रकार संकेत है कि एक समारोह कभी नहीं देता है

def some_func() -> None: 
    pass 

... या वापसी प्रकार अनिर्दिष्ट छोड़ने के लिए है, जो पीईपी तय करना चाहिए ग्रहण करने के लिए है कि किसी भी वापसी प्रकार संभव है स्थिर विश्लेषक का कारण:

एनोटेशन के बिना किसी भी समारोह सबसे सामान्य प्रकार संभव होने के रूप में व्यवहार किया जाना चाहिए

हालांकि, मैं कैसे संकेत, जो फ़ंक्शन रिटर्न कभी नहीं होगा टाइप करना चाहिए? उदाहरण के लिए, इन दो कार्यों के वापसी मूल्य को संकेत देने का सही तरीका क्या है?

def loop_forever(): 
    while True: 
     print('This function never returns because it loops forever') 

def always_explode(): 
    raise Exception('This function never returns because it always raises') 

न तो निर्दिष्ट करने -> None है और न ही वापसी प्रकार अनिर्दिष्ट छोड़ने इन मामलों में सही लगता है।

उत्तर

2

हालांकि "PEP 484 — Type Hints" मानक दोनों प्रश्न में और जवाब अभी तक कोई भी इसके अनुभाग उद्धरण में उल्लेख किया है।

उद्धरण:

typing मॉड्यूल एक विशेष प्रकार NoReturn कार्यों कि सामान्य रूप से कभी वापस नहीं टिप्पणी करने के लिए प्रदान करता है। उदाहरण के लिए, एक समारोह बिना शर्त एक अपवाद को जन्म देती है कि:

from typing import NoReturn 

def stop() -> NoReturn: 
    raise RuntimeError('no way') 

अनुभाग भी गलत प्रयोग के उदाहरण प्रदान करता है। हालांकि इसमें अंतहीन पाश के साथ फ़ंक्शंस शामिल नहीं हैं, टाइप सिद्धांत में वे दोनों समान रूप से संतुष्ट हैं कभी भी उस विशेष प्रकार द्वारा व्यक्त किए गए को वापस नहीं लौटाता है।

+1

जूलियन और मुझे पीईपी 484 में 'नोरेटर्न' प्रकार को नज़रअंदाज़ करने के लिए शायद माफ कर दिया जा सकता है जब मैंने जुलाई 2016 में इस सवाल से पूछा कि यह अभी तक अस्तित्व में नहीं है और इसे पीईपी में तब तक नहीं जोड़ा जाएगा जब तक [लगभग एक साल बाद] (https://github.com/python/peps/commit/881c6bebdb79d3a51dea0a467e81abed410e5570)। फिर भी, हाँ, ऐसा लगता है कि यह अब सही जवाब है। –

+0

वाह! इसलिए अपडेट तीन साल के दस्तावेज़ के लिए आज के लिए काफी ताजा है लेकिन इसमें [पीईपी 0] (https://www.python.org/dev/peps/) जैसे "अंतिम संशोधित" जैसे शीर्षलेख की कमी है। साथ ही, अब यह मुझे संकेत देता है कि क्यों मेरा आईडीई 'टाइपिंग' से' NoReturn' प्रकार को पहचानता नहीं है, फिर भी रनटाइम के दौरान कोई वास्तविक समस्या नहीं है। – misanthrope

2

जुलाई 2016 में, इस प्रश्न का अभी तक कोई जवाब नहीं था (अब NoReturn है; the new accepted answer देखें)।

  • एक समारोह वापस नहीं करता है, वहाँ कोई वापसी मान (यहां तक ​​कि नहीं None) है कि एक प्रकार को सौंपा जा सकता है: इन कारणों में से कुछ थे। तो आप वास्तव में एक प्रकार की टिप्पणी करने की कोशिश नहीं कर रहे हैं; यदि आप एक प्रकार के अभाव टिप्पणी करने की कोशिश कर रहे हैं।

  • प्रकार हिंट पीईपी सिर्फ अजगर संस्करण 3.5 के रूप में मानक में अपनाया गया है। इसके अलावा, पीईपी केवल किस प्रकार एनोटेशन की तरह दिखना चाहिए, जबकि जानबूझकर उन्हें कैसे उपयोग करने के लिए पर अस्पष्ट होने पर सलाह देता है। तो उदाहरण के अलावा, विशेष रूप से कुछ भी कैसे करना है, हमें कोई मानक नहीं बता रहा है।

    एनोटेशन मान्य भाव उस समय समारोह परिभाषित किया गया है पर अपवाद को ऊपर उठाने के बिना मूल्यांकन होना चाहिए (लेकिन आगे संदर्भ के लिए नीचे देखें):

  • पीईपी एक वर्ग Acceptable type hints निम्नलिखित बताते हुए है।

    एनोटेशन रखा जाना चाहिए सरल या स्थिर विश्लेषण उपकरण मूल्यों की व्याख्या करने में सक्षम नहीं हो सकता है। उदाहरण के लिए, गतिशील रूप से गणना किए गए प्रकारों को समझने की संभावना नहीं है। (यह एक जानबूझकर कुछ हद तक अस्पष्ट आवश्यकता है, विशिष्ट समावेशन और बहिष्करण के रूप में चर्चा से warranted इस पीईपी के भविष्य के संस्करणों के लिए जोड़ा जा सकता है।)

    तो यह बहुत ज्यादा रचनात्मक काम करने से आप को हतोत्साहित करने के लिए एक फेंकने की तरह की कोशिश करता है एक रिटर्न प्रकार संकेत के अंदर अपवाद यह संकेत करने के लिए कि एक समारोह कभी वापस नहीं आता है।

  • के बारे में कुछ अपवाद भी the PEP states the following:

    कोई वाक्य रचना स्पष्ट रूप से उठाया अपवाद लिस्टिंग के लिए प्रस्तावित है। वर्तमान में इस सुविधा के लिए केवल ज्ञात उपयोग के मामले documentational है, ऐसी स्थिति में सिफारिश एक docstring में यह जानकारी डाल करने के लिए है।

  • type comments पर एक सिफारिश है, जिसमें आप और अधिक स्वतंत्रता है नहीं है, लेकिन फिर भी उस अनुभाग एक प्रकार के अभाव दस्तावेज़ के लिए चर्चा नहीं है।

एक बात आप थोड़ा अलग स्थिति में की कोशिश कर सकते हैं, जब आप संकेत है कि एक पैरामीटर या कुछ "सामान्य" समारोह की वापसी मूल्य एक प्रतिदेय कि कभी नहीं देता है होना चाहिए चाहते हैं नहीं है। syntaxCallable[[ArgTypes...] ReturnType] है, इसलिए आप Callable[[ArgTypes...]] में वापसी प्रकार को छोड़ सकते हैं। हालांकि, यह अनुशंसित वाक्यविन्यास के अनुरूप नहीं है, इसलिए सख्ती से यह एक स्वीकार्य प्रकार संकेत नहीं है। टाइप चेकर्स की संभावना इस पर चकित होगी।

निष्कर्ष: आप अपने समय से आगे हैं। यह निराशाजनक हो सकता है, लेकिन आपके लिए भी एक फायदा है: आप अभी भी प्रभावित कर सकते हैं कि गैर-वापसी कार्यों को कैसे एनोटेट किया जाना चाहिए। मानकीकरण प्रक्रिया में शामिल होने के लिए शायद यह एक बहाना होगा। :-)

मेरे पास दो सुझाव हैं।

  1. एक Callable संकेत और कुछ भी प्रकार के आगे संकेत दिया करने की अनुमति में वापसी प्रकार को छोड़ते हुए की अनुमति दें। यह निम्न सिंटैक्स में परिणाम होगा:

    always_explode: Callable[[]] 
    def always_explode(): 
        raise Exception('This function never returns because it always raises') 
    
  2. परिचय एक bottom type like in Haskell:

    def always_explode() -> ⊥: 
        raise Exception('This function never returns because it always raises') 
    

इन दो सुझाव जोड़ा जा सकता है। The NoReturn type कि आपके प्रश्न को शामिल किया गया:

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