একটি নির্দিষ্ট ধরণের তালিকার ইঙ্গিতটি টাইপ করুন


128

পাইথন 3 এর ফাংশন টীকাগুলি ব্যবহার করে, পাইচার্ম এবং অন্যান্য আইডিইগুলিতে হিন্টিং টাইপের উদ্দেশ্যে একটি সমজাতীয় তালিকার (বা অন্যান্য সংগ্রহের) মধ্যে থাকা আইটেমগুলির ধরণ নির্দিষ্ট করা সম্ভব?

ইন্টিস্টের তালিকার জন্য সিউডো-পাইথন কোড উদাহরণ:

def my_func(l:list<int>):
    pass

আমি জানি এটি ডকস্ট্রিং ব্যবহার করে সম্ভব ...

def my_func(l):
    """
    :type l: list[int]
    """
    pass

... তবে আমি যদি টীকা শৈলীটি সম্ভব হয় তবে এটি পছন্দ করি।


আপনি কি ফাংশন টীকাতে একই বিন্যাসটি ব্যবহার করার চেষ্টা করেছেন? কি হলো?
জোনারশপে

@ জোনারশপে এটির একটি ত্রুটি বাড়াতে হবে কারণ type object is not subscriptableফাংশনটি সংজ্ঞায়িত করার সময়। স্পষ্টতই আপনি একটি স্ট্রিং ব্যবহার করতে পারেন: def my_func(L: 'list[int]')তবে পাইচার্ম এটি ডকাস্ট্রিংগুলিকে পার্স করার সাথে সাথে পার্স করবে কিনা তা আমি জানি না ...
বাকুরিউ

@ বাকুরিউ হ্যাঁ, আমি বোঝাতে চেয়েছি 'list[int]', যদি তা পরিষ্কার না হয় তবে দুঃখিত ।
jonrsharpe

পাইচার্ম এটি ডকাস্ট্রিংয়ের মতো পার্স করবে বলে মনে হয় না।
এরিক ডব্লিউ।

উত্তর:


161

আমার নিজের প্রশ্নের উত্তর দেওয়া; টিএলডিআর উত্তর হ্যাঁ হয় না

আপডেট 2

2015 এর সেপ্টেম্বরে পাইথন 3.5 3.5 টাইপ ইঙ্গিতগুলির সমর্থনে প্রকাশিত হয়েছিল এবং এতে একটি নতুন টাইপিং মডিউল অন্তর্ভুক্ত রয়েছে । এটি সংগ্রহের মধ্যে থাকা ধরণের নির্দিষ্টকরণের অনুমতি দেয় for নভেম্বর 2015 পর্যন্ত, জেটব্রেইনস পাইচার্ম 5.0 নীচে চিত্রিত হিসাবে টাইপ ইঙ্গিতগুলি অন্তর্ভুক্ত করতে পাইথন 3.5 কে সম্পূর্ণ সমর্থন করে।

টাইপ ইঙ্গিতগুলি ব্যবহার করে পাইচার্ম 5.0 কোড সমাপ্তি

আপডেট 1

2015 সালের মে পর্যন্ত, PEP0484 (টাইপ ইঙ্গিত) আনুষ্ঠানিকভাবে গৃহীত হয়েছে। এমবিভি / টাইপহিন্টিংয়ের অধীনে গিথুবে খসড়া বাস্তবায়নও পাওয়া যায় ।

আসল উত্তর

আগস্ট ২০১৪ পর্যন্ত, আমি নিশ্চিত করেছি যে সংগ্রহের মধ্যে প্রকারগুলি নির্দিষ্ট করতে পাইথন 3 প্রকারের টীকাগুলি ব্যবহার করা সম্ভব নয় (উদা: স্ট্রিংগুলির একটি তালিকা)।

পুনর্গঠিত পাঠ্য বা স্ফিংক্সের মতো ফর্ম্যাট করা ডকাস্ট্রিংগুলির ব্যবহার হ'ল কার্যকর বিকল্প এবং বিভিন্ন আইডিই দ্বারা সমর্থিত।

এটি আরও উপস্থিত হয় যে মাইপি অনুপ্রেরণায় টাইপ এনোটোটেশনগুলি বাড়ানোর ধারণাটি নিয়ে গুডো নিবিড় করছে: http://mail.python.org/pipermail/python-ideas/2014-August/028618.html


আপডেট: দেখা যাচ্ছে যে জেনেরিক প্রকারের জন্য সমর্থন অন্তর্ভুক্ত করার জন্য ইঙ্গিতটি PEP484
এরিক ডব্লিউ।

74

পাইথন ৩.৩ এখন আনুষ্ঠানিকভাবে বাইরে চলে গেছে, সেখানে টাইপ ইঙ্গিতগুলি সমর্থনকারী মডিউল রয়েছে - typingএবং Listজেনেরিক ধারকগুলির জন্য প্রাসঙ্গিক "টাইপ" রয়েছে।

অন্য কথায়, এখন আপনি এটি করতে পারেন:

from typing import List

def my_func(l: List[int]):
    pass

10

পিইপি 484 সাল থেকে টাইপ মন্তব্য যুক্ত করা হয়েছে

from . import Monitor
from typing import List, Set, Tuple, Dict


active_monitors = [] # type: List[Monitor]
# or
active_monitors: List[Monitor] = []

# bonus
active_monitors: Set[Monitor] = set()
monitor_pair: Tuple[Monitor, Monitor] = (Monitor(), Monitor())
monitor_dict: Dict[str, Monitor] = {'codename': Monitor()}

# nested
monitor_pair_list: List[Dict[str, Monitor]] = [{'codename': Monitor()}]

এটি বর্তমানে পাইথন 3.6.4 এর সাথে পাইচার্মে আমার জন্য কাজ করছে

পাইচার্মে উদাহরণ চিত্র


4

বিডিএফএলের সহায়তায়, এটি এখন প্রায় নিশ্চিত যে অজগর (সম্ভবত 3.5) ফাংশন টীকাগুলির মাধ্যমে টাইপ ইঙ্গিতগুলির জন্য একটি মানক সিনট্যাক্স সরবরাহ করবে।

https://www.python.org/dev/peps/pep-0484/

পিইপিতে যেমন উল্লেখ করা হয়েছে, সেখানে মাইপি নামে পরিচিত একটি পরীক্ষামূলক টাইপ-চেকার রয়েছে (ধরণের পাইলেন্টের মতো, তবে প্রকারের জন্য) যা ইতিমধ্যে এই স্ট্যান্ডার্ডটি ব্যবহার করে, এবং কোনও নতুন সিনট্যাক্সের প্রয়োজন নেই।

http://mypy-lang.org/


3

পাইথন ৩.৯ অনুসারে, বিল্টিন টাইপগুলি টীকাটি লেখার ক্ষেত্রে জেনেরিক ( পিইপি 585 দেখুন )। এটি সরাসরি উপাদানগুলির ধরণ নির্দিষ্ট করতে দেয়:

def my_func(l: list[int]):
    pass

পাইথন ৩.৯-এর আগে বিভিন্ন সরঞ্জাম এই সিনট্যাক্সটিকে সমর্থন করতে পারে। রানটাইম এ টীকাগুলি পরিদর্শন করা হয় না, বাক্য বাক্য উদ্ধৃতি বা ব্যবহার করে বৈধ __future__.annotations

# quoted
def my_func(l: 'list[int]'):
    pass
# postponed evaluation of annotation
from __future__ import annotations

def my_func(l: list[int]):
    pass
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.