Union
इस स्थिति के लिए ठीक करना है।
MyList = Union[List[str], List[int]]
def my_function(list_arg: MyList) -> None: ...
मैं एक सामान्य समारोह के रूप में उपयोग करने की अनुशंसा नहीं होगा:
from typing import Union, List
def my_function(list_arg: Union[List[str], List[int]]) -> None: ...
आप अक्सर इसका इस्तेमाल करते हैं, तो एक प्रकार उर्फ बनाना: यह आपके द्वारा निर्दिष्ट एक नए प्रकार है कि किसी भी प्रकार की हो सकती है बनाता है @ user6269244 उत्तर तब तक सुझाव देता है जब तक कि आपको किसी विशिष्ट कारण के लिए इसकी आवश्यकता न हो। हालांकि T = TypeVar('T', int, str)
एक साधारण मामले में काम करेगा, यह अधिक प्रतिबंधक होगा।
उदाहरण के लिए, अगर आप इस तरह कुछ है लगता है:
def apply_my_function(list_of_lists: List[MyList]) -> None:
# each item in list_of_lists is either a List[int] or List[str]
for arg in list_of_lists:
my_function(arg)
इस कोड में, आप कोई chioce है: आप की जरूरत एक Union
(List[List[T]]
तुम दोनों पूर्णांक और एक सूची की एक सूची संग्रहीत नहीं दूँगी str की वजह से T
उसी अभिव्यक्ति में str
और int
के बीच स्विच नहीं कर सकता है)।
लेकिन जब से तुम कोड है कि my_function
कॉल में Union
उपयोग करते हैं, आप भी my_function
खुद के हस्ताक्षर में Union
का उपयोग करना होगा।
इसके अतिरिक्त, जेनेरिक प्रकार की जटिलता में वृद्धि करते हैं, और किसी बिंदु पर आप टाइप सिस्टम की सीमाओं में भाग लेंगे। तो यह मामलों के लिए जेनरिक आरक्षित करना बेहतर है जहाँ आप वास्तव में, उन्हें जरूरत उदाहरण के लिए यदि आप my_function
की वापसी प्रकार तर्क प्रकार पर निर्भर करते हैं:
T = TypeVar("T", int, str)
# this can't be achieved with Union:
def my_function(list_arg: List[T]) -> T: ...
मुझे लगता है कि यह अधिक पूर्ण है इसलिए मैं इसे दूसरों के लिए सही चिह्नित कर रहा हूं लेकिन धन्यवाद @ user6269244 - इससे पहले समस्या मेरे लिए काफी हल हो गई! – vahndi