टाइप संकेत के साथ "अशक्त" रिटर्न प्रकार कैसे निर्दिष्ट करें


177

मान लीजिए कि मेरा कोई कार्य है:

def get_some_date(some_argument: int=None) -> %datetime_or_None%:
    if some_argument is not None and some_argument == 1:
        return datetime.utcnow()
    else:
        return None

मैं किसी चीज़ के लिए रिटर्न प्रकार कैसे निर्दिष्ट कर सकता हूं None?

जवाबों:


279

तुम खोज रहे हो Optional

चूंकि आपका रिटर्न प्रकार या तो हो सकता है datetime(जैसा कि लौटाया गया है datetime.utcnow()) या Noneआपको उपयोग करना चाहिए Optional[datetime]:

from typing import Optional

def get_some_date(some_argument: int=None) -> Optional[datetime]:
    # as defined

टाइपिंग पर प्रलेखन से, के Optionalलिए आशुलिपि है:

Optional[X]के बराबर है Union[X, None]

जहां का Union[X, Y]अर्थ है प्रकार Xया Y


यदि आप उन चिंताओं के कारण स्पष्ट होना चाहते हैं जो दूसरों पर ठोकर खा सकती हैं Optionalऔर उन्हें यह एहसास नहीं है कि यह अर्थ है, तो आप हमेशा उपयोग कर सकते हैं Union:

from typing import Union

def get_some_date(some_argument: int=None) -> Union[datetime, None]:

लेकिन मुझे संदेह है कि यह एक अच्छा विचार है, Optionalएक सांकेतिक नाम है और यह किस्ट्रोक्स के एक जोड़े को बचाता है।

के रूप में द्वारा @ Michael0x2a टिप्पणी में कहा Union[T, None]करने के लिए खुद को बदल रहा है Union[T, type(None)]उपयोग करने की आवश्यकता है ताकि typeयहाँ।

दृष्टिगत रूप से ये भिन्न हो सकते हैं लेकिन प्रोग्रामिक रूप से, दोनों ही मामलों में, परिणाम बिल्कुल समान हैं ; Union[datetime.datetime, NoneType]प्रकार में संग्रहीत किया जाएगा get_some_date.__annotations__* :

>>> from typing import get_type_hints
>>> print(get_type_hints(get_some_date))
{'return': typing.Union[datetime.datetime, NoneType],
 'some_argument': typing.Union[int, NoneType]}

* इसे सीधे एक्सेस करने के बजाय typing.get_type_hintsऑब्जेक्ट की __annotations__विशेषता को हथियाने के लिए उपयोग करें ।


10
आप सरल बना सकते हैं Union[datetime, type(None)]करने के लिए Union[datetime, None]- के अनुसार पीईपी 484 , का उपयोग कर Noneएक प्रकार एनोटेशन के भीतर हमेशा के बराबर होने के रूप में व्यवहार किया जाता है type(None)। ( typingप्रलेखन वास्तव Noneमें ज्यादातर मामलों में उपयोग होता है, लेकिन यहाँ नहीं है, जो एक निरीक्षण है)।
माइकल ० एक्स

@ Michael0x2a को यह नहीं पता था कि दिलचस्प है। इसे जोड़ा गया :)
दिमित्रिस फासरकिस हिलियार्ड

4
मैंने आगे बढ़कर इसे अभी ठीक करने के लिए एक पैच प्रस्तुत किया , इसलिए उम्मीद है कि निकट भविष्य में डॉक्स इस बारे में अधिक सुसंगत होंगे!
माइकल

1
Optional[T]प्रकार कार्यात्मक प्रोग्रामिंग समुदाय में अच्छी तरह से जाना जाता है। पाठक को न केवल यह पता होगा कि इसका मतलब है Union[T, None], बल्कि उपयोग पैटर्न को भी पहचानेंगे कि फ़ंक्शन कोई भी नहीं लौटाएगा जब कोई सार्थक उत्तर नहीं होता है, कोई त्रुटि होती है, या परिणाम नहीं मिलता है।
सप्त
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.