प्रकार-संकेत का उपयोग करके कई प्रकार के रिटर्न कैसे निर्दिष्ट करें


204

मेरे पास अजगर में एक फ़ंक्शन है जो या तो वापस आ सकता है boolया ए list। क्या प्रकार के संकेतों का उपयोग करके रिटर्न प्रकार निर्दिष्ट करने का एक तरीका है।

उदाहरण के लिए, क्या यह करने का सही तरीका है?

def foo(id) -> list or bool:
      ...

5
आप सूची या बूलियन के साथ कैसे समाप्त होते हैं?
पडराइक कनिंघम

11
@PadraicCunningham शायद कार्यान्वयन है मैंने तुम्हें अपनी पहचान भेज देंगे, आप मुझे या तो सूची या एक बूलियन भेज : डी
भार्गव राव

शायद यह कमजोर क्रियान्वयन है
स्रोवोमिर लेनर्ट

@ पपराइक कनिंघम बहुरूपता। यदि आपका फ़ंक्शन इनपुट पर एक जांच करता है, तो जो कुछ भी है, आप एक चर खिलाते समय बूलियन प्राप्त करना चाहते हैं या जब आप चर की एक सूची खिलाते हैं तो बूलियंस की एक सूची प्राप्त करते हैं।
गुरमीत

जवाबों:


281

से प्रलेखन

कक्षा typing.Union

संघ प्रकार; संघ [X, Y] का अर्थ है या तो X या Y।

इसलिए एक से अधिक रिटर्न डेटा प्रकार का प्रतिनिधित्व करने का उचित तरीका है

from typing import Union


def foo(client_id: str) -> Union[list,bool]

लेकिन ध्यान दें कि टाइपिंग लागू नहीं है। अजगर एक गतिशील टाइप भाषा बना हुआ है। एनोटेशन सिंटैक्स को उत्पादन में जारी होने से पहले कोड के विकास के दौरान मदद करने के लिए विकसित किया गया है। पीईपी 484 में कहा गया है, "रनटाइम के दौरान किसी प्रकार की जाँच नहीं होती है।"

>>> def foo(a:str) -> list:
...     return("Works")
... 
>>> foo(1)
'Works'

जैसा कि आप देख सकते हैं कि मैं एक इंट वैल्यू पास कर रहा हूं और एक str लौटा रहा हूं। हालांकि __annotations__संबंधित मूल्यों के लिए निर्धारित किया जाएगा।

>>> foo.__annotations__ 
{'return': <class 'list'>, 'a': <class 'str'>}

टाइप संकेत के बारे में अधिक जानने के लिए कृपया PEP 483 पर जाएं । यह भी देखें कि पायथन 3.5 में टाइप संकेत क्या हैं ?

कृपया ध्यान दें कि यह केवल पायथन 3.5 और ऊपर की ओर उपलब्ध है। इसका उल्लेख पीईपी 484 में स्पष्ट रूप से किया गया है ।


क्या पायथन 3.4 में एक समान है
याह्या उद्दीन

1
@YahyaUddin नहीं - पीईपी 484 : '(.... यह केवल Python3.5 के लिए ऊपर की ओर है।
भार्गव राव

1
@ ययाउद्दीन काफी हैरान। क्या आपके पास किसी भी संयोग से फ़ंक्शन एनोटेशन का मतलब है ?
भार्गव राव

2
तो मुझे देखने दो अगर मुझे यह मिल गया। पायथन 3.4 में फ़ंक्शन एनोटेशन हैं जो एनोटेट के अलावा कुछ भी नहीं करते हैं जो लागू नहीं है। लेकिन पायथन 3.5 में यह वास्तविक प्रकार की जाँच है।
याह्या उद्दीन

1
@ भार्गवराव, इसके बारे में क्षमा करें! मुझे लगा कि टिप्पणी अनुभाग में छोड़ना बहुत महत्वपूर्ण है।
बोबार्ट

26

def foo(client_id: str) -> list or bool:जब मूल्यांकन किया जाता है तो यह कथन बराबर होता है def foo(client_id: str) -> list:और इसलिए आप जो चाहते हैं वह नहीं करेंगे।

"या तो ए या बी" प्रकार के संकेत का वर्णन करने का मूल तरीका संघ है (भार्गव राव के लिए धन्यवाद):

def foo(client_id: str) -> Union[list, bool]:

मैं यह नहीं चाहता कि "आप वैसे भी ऐसा क्यों करना चाहते हैं" आदमी, लेकिन शायद 2 रिटर्न प्रकार आप चाहते हैं क्या नहीं है:

यदि आप किसी प्रकार की विशेष त्रुटि-स्थिति को इंगित करने के लिए एक बूल वापस करना चाहते हैं, तो इसके बजाय अपवाद का उपयोग करने पर विचार करें। यदि आप एक बूल को कुछ विशेष मूल्य के रूप में वापस करना चाहते हैं, तो शायद एक खाली सूची एक अच्छा प्रतिनिधित्व होगी। आप यह भी बता सकते हैं कि Noneकिसके साथ लौटा जा सकता हैOptional[list]


6
ऐसे उपयोग हैं जहां कई प्रकार लौट सकते हैं जो आप चाहते हैं: उदाहरण के लिए यदि आपको उप-वर्गों के कुछ सेटों में से एक को वापस करने की आवश्यकता है, लेकिन अन्य उपप्रकारों को नहीं, या यदि आप डेटा को संसाधित करने का प्रयास कर रहे हैं और यदि प्रसंस्करण नहीं है तो कच्चे रूप को वापस करना चाहते हैं। 'उपलब्ध है। इसके अलावा, यदि आप विरासत कोड लपेट रहे हैं तो यह काफी उपयोगी हो सकता है, क्योंकि यह अपग्रेड प्रक्रिया और / या अजीब स्थानों को देखने में मदद करता है।
नथानिएल फोर्ड

अपवाद और खाली सूची विचार सहायक था। धन्यवाद
याह्या उद्दीन

20

यदि कोई "कई प्रकार के वापसी मूल्यों को कैसे निर्दिष्ट करें" की तलाश में यहां उतरा, तो उपयोग करें Tuple[type_value1, ..., type_valueN]

from typing import Tuple

def f() -> Tuple[dict, str]:
    a = {1: 2}
    b = "hello"
    return a, b

अधिक जानकारी: https://code-examples.net/en/q/2651e60

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