2016-10-05 6 views
9

मैं नया पायथन 3.5 मॉड्यूल typing का उपयोग कर रहा हूं और यह आनंददायक रहा है।टाइपिंग मॉड्यूल - स्ट्रिंग लिटल टाइप

मैं सोच रहा था कि कोई सटीक स्ट्रिंग अक्षर के आधार पर एक प्रकार निर्दिष्ट कैसे कर सकता है। उदाहरण के लिए, चार कार्यों में से एक को लौटने की गारंटी दी जाती है - "उत्तर", "पश्चिम", "पूर्व", "दक्षिण - हम इसे str के बजाय एक विशिष्ट प्रकार चर के रूप में कैसे व्यक्त कर सकते हैं।

बस str लौटने के बजाय

def compute_quadrant(x: int, y: int) -> str: 
    if x > 0 and y > 0: 
     return 'I' 
    elif x < 0 and y > 0: 
     return 'II' 
    elif x < 0 and y < 0: 
     return 'III' 
    elif x > 0 and y < 0: 
     return 'IV' 

, मैं था: मैं प्रलेखन के माध्यम से देखा, Union प्रकार और TypeVar समारोह खोजने के लिए, लेकिन एक जवाब खोजने में असमर्थ था

एक उदाहरण समारोह इस समस्या को व्यक्त। एक और विशिष्ट प्रकार को वापस करना है जो कि चार मानों में से एक है - "I", "II", "III", या "IV"

टाइपस्क्रिप्ट में, कोई भी कर सकता है: type Quadrant = "I" | "II" | "III" | "IV" - typing मॉड्यूल के साथ इस उपयोग के मामले में कोई अच्छी पायथन चीनी है?

+5

टाइपिंग से संबंधित नहीं है, लेकिन क्या आपने 'enum' माना है? –

+0

क्या मैं पूछ सकता हूं, आपको ऐसी चीज़ क्यों चाहिए? क्योंकि टेक्स्ट एडिटर्स और प्रोग्रामर के लिए एनोटेशन टाइप किए जाते हैं जो कोड देखते हैं। यदि आप उन तत्वों की सीमा को सीमित कर सकते हैं जो फ़ंक्शन वापस कर सकते हैं तो आप निश्चित रूप से कह सकते हैं कि कोड को देखने से। –

+0

शायद इस विशिष्ट कार्य ने उपयोग के मामले की रूपरेखा नहीं दी है (क्योंकि यह सरल और सीधा आगे है), लेकिन कोड लिखते समय, मैं अपने साथियों को जितना संभव हो उतना संदर्भ देना चाहता हूं। जब वस्तुओं को जोड़ना और वस्तुओं पर जटिल संचालन करना, तो मैं बहुत सख्त और सटीक प्रकार की पेशकश करने में सक्षम होना चाहता हूं। इसके अतिरिक्त, विश्लेषण उपकरण प्रकारों के आधार पर अनुकूलन के बिंदु ढूंढने में सक्षम हैं - जैसे कोड पथ जो कभी भी हिट नहीं होंगे, या गलती की गलतियों। – fructosewizard

उत्तर

1

आपके द्वारा पूछे जाने वाले typing मॉड्यूल को अस्वीकार करते हुए, आपकी समस्या का एक समाधान Enum का उपयोग कई टिप्पणियों में किया जा सकता है। इसके लिए कोड इस तरह दिखेगा:

from enum import Enum 

class Quadrant(Enum): 
    I = 1 
    II = 2 
    III = 3 
    IV = 4 

def compute_quadrant(x: int, y: int) -> Quadrant: 
    if x > 0 and y > 0: 
     return Quadrant.I 
    elif x < 0 and y > 0: 
     return Quadrant.II 
    elif x < 0 and y < 0: 
     return Quadrant.III 
    elif x > 0 and y < 0: 
     return Quadrant.IV 
    # return None # this is what happens without an else clause! 

if __name__ == "__main__": 
    quad = compute_quadrant(1, -1) 
    print(quad, type(quad))    # -> Quadrant.IV <enum 'Quadrant'> 
    print(quad.name, type(quad.name)) # -> IV <class 'str'> 
    print(quad.value, type(quad.value)) # -> 4 <class 'int'> 

जैसा कि आप देख सकते हैं कि आप Enums नाम और मान का उपयोग कर सकते हैं। नाम आपके द्वारा पूछे जाने वाले तारों में से एक है।

एक समस्या जो मैं यहां देखता हूं, वह है और को Quadrant के लिए वैध वापसी मान के रूप में स्वीकार करने के मैपी के मौजूदा व्यवहार में है। इसे मैन्युअल रूप से संभाला जाना चाहिए।

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