একাধিক রিটার্ন মানগুলির ধরণ কীভাবে বারণ করা যায়?


107

আমি কীভাবে কোনও ফাংশনটি বর্নিত করতে টাইপ ইঙ্গিতগুলি ব্যবহার করব Iterableযা সর্বদা দুটি মান দেয়: একটি boolএবং একটি str? ইঙ্গিতটি Tuple[bool, str]নিকটে, ব্যতীত এটি কোনও জেনারেটর বা অন্য ধরণের পুনরাবৃত্তযোগ্য নয়, রিটার্ন মান প্রকারকে টুপলে সীমাবদ্ধ করে।

আমি বেশিরভাগই কৌতূহলী কারণ আমি এমন একটি ফাংশনটি বর্ননা করতে চাই foo()যা এই জাতীয় একাধিক মান ফেরত দিতে ব্যবহৃত হয়:

always_a_bool, always_a_str = foo()

সাধারণত ফাংশনগুলির মতো foo()কিছু করার মতো return a, b(যা একটি টিপল দেয়) তবে আমি জেনারেটর বা তালিকা বা অন্য কোনও কিছু দিয়ে ফিরে আসা টিপলটি প্রতিস্থাপনের জন্য টাইপ ইঙ্গিতটি যথেষ্ট নমনীয় হতে চাই।



4
@ স্টিভেন.ভ্যাসেল্লারো এটি সেই প্রশ্নের সদৃশ নয়
টিডব্লিউআর কোল

উত্তর:


144

আপনি সর্বদা একটি বস্তু ফিরিয়ে দিচ্ছেন ; return one, twoসহজভাবে ব্যবহার করে একটি tuple ফেরত।

হ্যাঁ, -> Tuple[bool, str]সম্পূর্ণ সঠিক।

শুধুTuple টাইপ আপনি যদি একটি নির্দিষ্ট করতে দেয় নির্দিষ্ট সংখ্যক একটি স্বতন্ত্র ধরনের সঙ্গে উপাদানের, প্রতিটি। আপনার ফাংশনটি যদি একটি নির্দিষ্ট সংখ্যক প্রত্যাবর্তন মান উত্পন্ন করে , বিশেষত যখন এই মানগুলি নির্দিষ্ট, স্বতন্ত্র প্রকারের হয় তবে আপনার সত্যিকার অর্থেই একটি ফিরতি ফিরতে হবে ।

অন্যান্য ক্রমের ধরণের উপাদানগুলির পরিবর্তনশীল সংখ্যার জন্য এক ধরণের স্পেসিফিকেশন থাকার আশা করা হয় , সুতরাং typing.Sequenceএখানে উপযুক্ত নয়। এছাড়াও তালিকা এবং tuples মধ্যে পার্থক্য দেখুন?

টিপলগুলি হ'ল ডিগ্রি স্ট্রাকচার (যেমন, তাদের এন্ট্রিগুলির পৃথক অর্থ রয়েছে), যখন তালিকাটি একজাতীয় ক্রম হয়। টিপলসের কাঠামো থাকে, তালিকার অর্ডার থাকে।

পাইথনের ধরণের ইঙ্গিত সিস্টেম সেই দর্শনের সাথে মেনে চলে, নির্দিষ্ট দৈর্ঘ্যের একটি পুনরাবৃত্তযোগ্য নির্দিষ্ট নির্দিষ্ট স্থানে নির্দিষ্ট ধরণের নির্দিষ্ট করার জন্য বর্তমানে কোনও বাক্য গঠন নেই।

যদি আপনাকে অবশ্যই উল্লেখ করতে হয় যে কোনও পুনরাবৃত্তিযোগ্য কাজ করবে, তবে আপনি সবচেয়ে ভাল যা করতে পারেন তা হ'ল:

-> Iterable[Union[bool, str]]

এই মুহুর্তে কলার যে কোনও ক্রমে , এবং অজানা দৈর্ঘ্যের (কোথাও 0 এবং অনন্তের মধ্যে) বুলিয়ান এবং স্ট্রিংগুলি আশা করতে পারে ।


4
ভাষা স্পেসিফিকেশন অন্যান্য iterables ফেরার অনুমতি দেয়; foo()করতে পারে yield True; yield "blah"এবং a, b = foo()এখনও কাজ করবে। অথবা foo()একটি তালিকা ফিরে আসতে পারে। আমি আমার প্রশ্নের উত্তরটি স্পষ্ট করে দিয়েছিলাম যে আমি একটি স্বেচ্ছাসেবীর পুনরাবৃত্তির ইঙ্গিত দিতে আগ্রহী, একটি টিউপল নয়।
রিচার্ড হ্যানসেন

4
@ রিচার্ডহানসেন: পোস্ট করার পর থেকে আমি পিইপি এবং ডকুমেন্টেশন typingএবং mypyআরও 2 বার পুনরায় পরীক্ষা করেছি ; আমি বেশ আত্মবিশ্বাসী আমি কিছুই মিস করি না। এটি বলেছিল, এসওতে এখানে প্রচুর পাইথন টাইপের হিন্টিং অভিজ্ঞতা রয়েছে এমন অনেক নিয়ামক রয়েছে যা ভুল হতে দেখাতে আমাকে সংশোধন করতে দ্বিধা করবে না, বা আরও ভাল উত্তর পোস্ট করবে।
মার্টিজন পিটারস

19
আমাকে from typing import Tupleকাজ করতে টুপল টীকা যোগ করতে হয়েছিল।
পিএইচপিরেট

4
@ পিএইচপিরেট: হ্যাঁ, এবং আপনাকে Iterableএবং এর জন্য একই কাজ করতে হবে Union। যেহেতু আমরা এখানে তাদের নির্দিষ্ট ব্যবহার নিয়ে আলোচনা করছি, তাই আমদানি নিহিত।
মার্টিজন পিটারস

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