Optional[...]সংক্ষিপ্ত স্বরলিপি Union[..., None], টাইপ চেকারকে বলছেন যে হয় নির্দিষ্ট ধরণের একটি বস্তুর প্রয়োজন হয়, বা None প্রয়োজনীয় required জটিল যৌগিক ধরণের বা আরও অনেক ধরণের সহ কোনও বৈধ প্রকারের ইঙ্গিত... বোঝায় । যখনই আপনার ডিফল্ট মান সহ কোনও কীওয়ার্ড যুক্তি থাকে , আপনার ব্যবহার করা উচিত ।Union[]NoneOptional
সুতরাং আপনার দুটি উদাহরণের জন্য আপনার dictএবং listধারক প্রকারের রয়েছে তবে aকীওয়ার্ড আর্গুমেন্টের জন্য ডিফল্ট মান দেখায় যে Noneখুব বেশি অনুমোদিত তাই ব্যবহার করুন Optional[...]:
from typing import Optional
def test(a: Optional[dict] = None) -> None:
def test(a: Optional[list] = None) -> 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
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"""
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টীকাগুলি ব্যবহার করতে চাইতে পারেন যে কোনও ফাংশন বিষয়বস্তুগুলিকে পরিবর্তিত করবে না (এগুলি কেবল 'পঠনযোগ্য' হিসাবে বিবেচিত হবে), এবং এতে ফাংশনগুলি কাজ করবে যথাক্রমে ম্যাপিং বা ক্রম হিসাবে কাজ করে এমন কোনও বস্তু।
DictএবংListটাইপিং এবং লেখ থেকেOptional[Dict]এবংOptional[List]পরিবর্তেOptional[dict]...