টাইপ-ইঙ্গিতগুলি ব্যবহার করে একাধিক রিটার্ন টাইপ কীভাবে নির্দিষ্ট করা যায়


204

অজগরটিতে আমার একটি ফাংশন রয়েছে যা হয় হয় boolবা একটি ফেরত দিতে পারে list। টাইপ ইঙ্গিতগুলি ব্যবহার করে ফেরতের ধরণগুলি নির্দিষ্ট করার কোনও উপায় আছে কি?

উদাহরণস্বরূপ, এটি করার সঠিক উপায় কি এটি?

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

5
আপনি কীভাবে একটি তালিকা বা বুলেটিয়ান দিয়ে শেষ করবেন?
প্যাডেরিক কানিংহাম

11
@PadraicCunningham সম্ভবত বাস্তবায়ন আমি আপনাকে আমার আইডি পাঠাবো, তুমি আমাকে হয় একটি তালিকা বা একটি বুলিয়ান পাঠাতে : ডি
Bhargav রাও

সম্ভবত এটি দুর্বল বাস্তবায়ন
সাওমির লেনার্ট

টুইটারে যদি আপনার ফাংশন ইনপুটটিতে যাচাই করে না কেন, যা কিছু হোক না কেন, আপনি কোনও ভেরিয়েবলকে খাওয়ানোর সময় আপনি বুলিয়ান পেতে চান বা ভেরিয়েবলের একটি তালিকা খাওয়ানোর সময় বুলিয়ানগুলির একটি তালিকা পেতে চান।
গুইমোট

উত্তর:


281

ডকুমেন্টেশন থেকে

শ্রেণী typing.Union

ইউনিয়নের ধরণ; ইউনিয়ন [এক্স, ওয়াই] অর্থ এক্স বা ওয়াই হয় either

সুতরাং একাধিক রিটার্ন ডেটা প্রকার উপস্থাপনের সঠিক উপায় is

from typing import Union


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

তবে লক্ষ করুন যে টাইপিং প্রয়োগ করা হয় না। পাইথন গতিশীল টাইপযুক্ত ভাষা অবিরত রয়েছে। প্রযোজনায় প্রকাশের আগে কোডটির বিকাশকালে সহায়তার জন্য টিকাশ বাক্সটি তৈরি করা হয়েছে। পিইপি 484-তে বলা হয়েছে, "রানটাইমের সময় কোনও ধরণের চেকিং হয় না।"

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

আপনি দেখতে পাচ্ছেন যে আমি একটি মান মান পাস করছি এবং একটি স্ট্রিং ফিরিয়ে দিচ্ছি। তবে __annotations__স্ব স্ব মানগুলিতে সেট করা হবে।

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

পিইপি 483 মাধ্যমে যানটাইপ ইঙ্গিত সম্পর্কে আরও জানতে । পাইথন 3.5 তে টাইপ ইঙ্গিতগুলি কী কী তা দেখুন ?

দয়া করে নোট করুন যে এটি কেবল পাইথন 3.5 এবং তারপরের দিকে উপলব্ধ। পিইপি 484 এ এটি স্পষ্টভাবে উল্লেখ করা হয়েছে ।


পাইথন ৩.৪-এর সমতুল্য কি আছে
ইয়াহিয়া উদ্দিন

1
@YahyaUddin নাঃ - PEP 484 : '(.... এটা শুধুমাত্র Python3.5 জন্য ঊর্ধ্বমুখী হচ্ছে।
Bhargav রাও

1
@ ইয়াহিয়াউদ্দিন বেশ অবাক করে দিন। আপনি কি কোনও সুযোগে ফাংশন টিকাশ বোঝাতে চেয়েছিলেন ?
Bhargav রাও

2
সুতরাং আমি এটি পেয়েছি কিনা তা আমাকে দেখতে দিন। পাইথন ৩.৪-এ ফাংশন টীকাগুলি রয়েছে যা এনটোটেট করা ছাড়া আর কিছু করে না যা প্রয়োগ করা হয় না। কিন্তু পাইথন 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-example.net/en/q/2651e60

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.