আমার কীভাবে typeচ্ছিক প্রকারের ইঙ্গিতটি ব্যবহার করা উচিত?


95

আমি কীভাবে Optionalইঙ্গিতটি ব্যবহার করব তা বোঝার চেষ্টা করছি । থেকে PEP-484 , আমি জানি আমি ব্যবহার করতে পারেন Optionalজন্য def test(a: int = None)যেমন পারেন def test(a: Union[int, None])বা def test(a: Optional[int])

তবে কীভাবে নিম্নলিখিত উদাহরণগুলি সম্পর্কে?

def test(a : dict = None):
    #print(a) ==> {'a': 1234}
    #or
    #print(a) ==> None

def test(a : list = None):
    #print(a) ==> [1,2,3,4, 'a', 'b']
    #or
    #print(a) ==> None

যদি Optional[type]মনে হয় একই জিনিসটিকে Union[type, None]কেন বোঝায় , তবে কেন আমি Optional[]আদৌ ব্যবহার করব ?

উত্তর:


135

Optional[...]সংক্ষিপ্ত স্বরলিপি Union[..., None], টাইপ চেকারকে বলছেন যে হয় নির্দিষ্ট ধরণের একটি বস্তুর প্রয়োজন হয়, বা None প্রয়োজনীয় required জটিল যৌগিক ধরণের বা আরও অনেক ধরণের সহ কোনও বৈধ প্রকারের ইঙ্গিত... বোঝায় । যখনই আপনার ডিফল্ট মান সহ কোনও কীওয়ার্ড যুক্তি থাকে , আপনার ব্যবহার করা উচিত ।Union[]NoneOptional

সুতরাং আপনার দুটি উদাহরণের জন্য আপনার dictএবং listধারক প্রকারের রয়েছে তবে aকীওয়ার্ড আর্গুমেন্টের জন্য ডিফল্ট মান দেখায় যে Noneখুব বেশি অনুমোদিত তাই ব্যবহার করুন Optional[...]:

from typing import Optional

def test(a: Optional[dict] = None) -> None:
    #print(a) ==> {'a': 1234}
    #or
    #print(a) ==> None

def test(a: Optional[list] = None) -> None:
    #print(a) ==> [1, 2, 3, 4, 'a', 'b']
    #or
    #print(a) ==> None

মনে রাখবেন যে এ ব্যবহার Optional[]করে 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

# subwidget ids used to be integers, now they are strings. Support both.
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পতাকা একটি মান অভাবে বোঝানো হয়।

পার্শ্ব দ্রষ্টব্য: যদি না আপনার কোডটি কেবল পাইথন ৩.৯ বা তার চেয়ে বেশি নতুন সমর্থন করে আপনি স্ট্যান্ডার্ড লাইব্রেরি ধারক প্রকারের হিন্টিং ব্যবহার করা এড়াতে চান, কারণ এতে কী ধরনের থাকতে হবে সে সম্পর্কে আপনি কিছু বলতে পারবেন না। সুতরাং পরিবর্তে dictএবং list, ব্যবহার করুন typing.Dictএবং typing.Listযথাক্রমে। এবং যখন কেবল কোনও ধারক প্রকার থেকে পড়া হয়, আপনি ঠিক তেমন কোনও অপরিবর্তনীয় বিমূর্ত কন্টেইনার প্রকার গ্রহণ করতে পারেন; তালিকাগুলি এবং tuples হ'ল 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"""
    # print(a) ==> {'a': 1234}
    # or
    # print(a) ==> None

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

পাইথন ৩.৯ এবং তারপরে, স্ট্যান্ডার্ড কনটেইনার ধরণের সমস্ত ইঙ্গিতগুলিতে টাইপ করে সমর্থন করার জন্য আপডেট করা হয়েছে, পিইপি 585 দেখুনতবে , আপনি এখন ব্যবহার করতে পারবেনdict[str, int] বা list[Union[int, str]], আপনি এখনও আরও প্রকাশিত Mappingএবং Sequenceটীকাগুলি ব্যবহার করতে চাইতে পারেন যে কোনও ফাংশন বিষয়বস্তুগুলিকে পরিবর্তিত করবে না (এগুলি কেবল 'পঠনযোগ্য' হিসাবে বিবেচিত হবে), এবং এতে ফাংশনগুলি কাজ করবে যথাক্রমে ম্যাপিং বা ক্রম হিসাবে কাজ করে এমন কোনও বস্তু।


@MartijnPieters আমরা আমদানি করার দরকার নেই না Dictএবং Listটাইপিং এবং লেখ থেকে Optional[Dict]এবং Optional[List]পরিবর্তে Optional[dict]...
আলিরেজা

@ আলিরেজা হ্যাঁ, এবং আমি জবাব দিয়েছি যে আমার উত্তরটিতে ইতিমধ্যে। : দেখুন সাইড নোট: হিসাবে আপনি তারা কি ধরনের থাকা আবশ্যক সম্পর্কে কিছু বলতে পারবে না তুমি, টাইপ আদর্শ গ্রন্থাগার ধারক ধরনের অবশ্য ইঙ্গিত ব্যবহার এড়াতে চান
Martijn Pieters

আমাকে সঠিক যদি আমি ভুল কিন্তু 3.9 পারবেন listএবং dictটাইপ ইঙ্গিত, (বনাম জন্য ব্যবহার করা List, Dict)। python.org/dev/peps/pep-0585
ব্যবহারকারী 48956

4
@ ব্যবহারকারী 48956: আমি 3.9-তে একটি বিভাগ যুক্ত করেছি।
মার্টিজন পিটারস

4

সরাসরি মাইপি টাইপিং মডিউল ডক্স থেকে

  • “[চ্ছিক [টিআর] হ'ল সংক্ষিপ্তকরণের জন্য কেবলমাত্র একটি শর্টহ্যান্ড বা উপন্যাস [টিআর, কিছুই নয়]। এটি বেশিরভাগ ক্ষেত্রে ফাংশন স্বাক্ষরগুলিকে একটু পরিচ্ছন্ন দেখাতে সহায়তা করার সুবিধার্থে বিদ্যমান। "
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.