2016-04-29 5 views
5

मैं एक समारोह के लिए एक प्रकार का संकेत प्राप्त कर सकते हैं निर्दिष्ट करना चाहते हैं निर्दिष्ट करने के लिए या तो str रों की एक list या int रों की एक list। क्या Python का उपयोग कर ऐसा करने का कोई तरीका है? कुछ की तरह:उपयोग अजगर टाइपिंग पुस्तकालय एक से अधिक संभव प्रकार

from typing import List 

def my_function(list_arg: List[str|int]): 

    ... 
    ... 

उत्तर

2

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: ... 
+0

मुझे लगता है कि यह अधिक पूर्ण है इसलिए मैं इसे दूसरों के लिए सही चिह्नित कर रहा हूं लेकिन धन्यवाद @ user6269244 - इससे पहले समस्या मेरे लिए काफी हल हो गई! – vahndi

-1
from typing import TypeVar, List 

T = TypeVar("T", int, str) 

def my_function(list_arg: List[T]): 
... 
+0

यह वास्तव में सही है, लेकिन तभी जब एक के लिए एक आवश्यकता नहीं है जेनेरिक फ़ंक्शन, जो प्रश्न से स्पष्ट नहीं है। उदाहरण के लिए, यदि आप 'my_function' के अंदर चर के प्रकारों में 'टी' का उपयोग करना चाहते हैं या 'my_function' के रिटर्न प्रकार में। – max

संबंधित मुद्दे