Optional[...]
Union[..., None]
प्रकार चेकर के लिए एक शॉर्टहैंड नोटेशन है , जो या तो विशिष्ट प्रकार के ऑब्जेक्ट की आवश्यकता है, या None
आवश्यक है। किसी भी वैध प्रकार के संकेत...
के लिए खड़ा है , जिसमें जटिल यौगिक प्रकार या अधिक प्रकार शामिल हैं। जब भी आपके पास डिफ़ॉल्ट मान के साथ कोई कीवर्ड तर्क हो , तो आपको उपयोग करना चाहिए ।Union[]
None
Optional
तो आपके दो उदाहरणों के लिए, आपके पास dict
और list
कंटेनर प्रकार हैं, लेकिन a
कीवर्ड तर्क के लिए डिफ़ॉल्ट मान दिखाता है कि None
अनुमति बहुत अधिक है Optional[...]
:
from typing import Optional
def test(a: Optional[dict] = None) -> None:
def test(a: Optional[list] = None) -> None:
ध्यान दें कि तकनीकी तौर Optional[]
पर a का उपयोग करने Union[]
, या सिर्फ जोड़ने के बीच कोई अंतर नहीं None
है Union[]
। तो Optional[Union[str, int]]
और Union[str, int, None]
बिल्कुल यही बात हैं।
व्यक्तिगत रूप से, मैं हमेशाOptional[]
ऐसे कीवर्ड तर्क के लिए प्रकार सेट करते समय उपयोग करता हूं, = None
जो डिफ़ॉल्ट मान सेट करने के लिए उपयोग करता है, इस कारण से None
बेहतर अनुमति दी जाती है। इसके अलावा, Union[...]
एक अलग प्रकार के उर्फ में भाग को स्थानांतरित करना आसान है , या Optional[...]
यदि कोई तर्क अनिवार्य हो जाता है, तो बाद में भाग को हटा दें ।
उदाहरण के लिए, आप कहें
from typing import Optional, Union
def api_function(optional_argument: Optional[Union[str, int]] = None) -> None:
"""Frob the fooznar.
If optional_argument is given, it must be an id of the fooznar subwidget
to filter on. The id should be a string, or for backwards compatibility,
an integer is also accepted.
"""
फिर प्रलेखन Union[str, int]
को एक प्रकार के उपनाम में खींचकर सुधार किया जाता है:
from typing import Optional, Union
SubWidgetId = Union[str, int]
def api_function(optional_argument: Optional[SubWidgetId] = None) -> None:
"""Frob the fooznar.
If optional_argument is given, it must be an id of the fooznar subwidget
to filter on. The id should be a string, or for backwards compatibility,
an integer is also accepted.
"""
Union[]
एक उपनाम में स्थानांतरित करने के लिए परावर्तक को सभी बहुत आसान बना दिया Optional[...]
गया क्योंकि इसका उपयोग किया गया था Union[str, int, None]
। None
मूल्य यह मूल्य का हिस्सा नहीं है,, सब के बाद एक 'subwidget आईडी' नहीं है None
ध्वज को एक मूल्य के अभाव के लिए है।
साइड नोट: जब तक आपके कोड को केवल Python 3.9 या नए का समर्थन नहीं करना है, आप टाइप लाइब्रेरी में मानक लाइब्रेरी कंटेनर प्रकारों के उपयोग से बचना चाहते हैं, क्योंकि आप कुछ भी नहीं कह सकते हैं कि उन्हें किस प्रकार का होना चाहिए। तो बजाय dict
और list
, उपयोग typing.Dict
और typing.List
, क्रमशः। और जब केवल एक कंटेनर प्रकार से पढ़ते हैं , तो आप बस किसी भी अपरिवर्तनीय सार कंटेनर प्रकार को स्वीकार कर सकते हैं; सूचियाँ और टुपल्स Sequence
ऑब्जेक्ट्स हैं, जबकि dict
एक Mapping
प्रकार है:
from typing import Mapping, Optional, Sequence, Union
def test(a: Optional[Mapping[str, int]] = None) -> None:
"""accepts an optional map with string keys and integer values"""
def test(a: Optional[Sequence[Union[int, str]]] = None) -> None:
"""accepts an optional sequence of integers and strings
# print(a) ==> [1, 2, 3, 4, 'a', 'b']
# or
# print(a) ==> None
Python 3.9 और ऊपर में, मानक कंटेनर प्रकारों को सभी प्रकार के संकेतों में उनका उपयोग करने के लिए अद्यतन किया गया है, PEP 585 देखें । लेकिन , जब आप अब उपयोग कर सकते हैं dict[str, int]
या list[Union[int, str]]
, आप अभी भी अधिक अभिव्यंजक Mapping
और Sequence
एनोटेशन का उपयोग करना चाह सकते हैं ताकि यह इंगित किया जा सके कि कोई फ़ंक्शन सामग्री को म्यूट नहीं कर रहा है (उन्हें 'केवल पढ़ने के लिए' माना जाता है), और यह कि फ़ंक्शन के साथ काम करेगा कोई भी वस्तु जो क्रमशः मानचित्रण या अनुक्रम के रूप में काम करती है।
Dict
औरList
टाइपिंग और लिखने सेOptional[Dict]
औरOptional[List]
के बजायOptional[dict]
...