2016-12-18 9 views
7

मै मैपी के साथ पाइथन 3.5 का उपयोग कर रहा हूं ताकि मेरी स्क्रिप्ट के लिए कुछ बुनियादी स्थैतिक जांच हो। हाल ही में मैंने ऑर्डर्ड डिक्ट को वापस करने के लिए कुछ तरीकों का पुन: उपयोग किया, लेकिन "टाइप 'ऑब्जेक्ट में भाग लिया गया है सबस्क्राइबबल नहीं है" त्रुटि, जब मैंने कुंजी और वैल्यू प्रकार निर्दिष्ट के साथ रिटर्न एनोटेशन का उपयोग करने का प्रयास किया।मैं माईपी प्रकार एनोटेशन के लिए ऑर्डर्ड डिक्ट के, वी प्रकार कैसे निर्दिष्ट करूं?

घटित उदाहरण:

#!/usr/bin/env python3.5 

from collections import OrderedDict 

# this works 
def foo() -> OrderedDict: 
    result = OrderedDict() # type: OrderedDict[str, int] 
    result['foo'] = 123 
    return result 

# this doesn't 
def foo2() -> OrderedDict[str, int]: 
    result = OrderedDict() # type: OrderedDict[str, int] 
    result['foo'] = 123 
    return result 

print(foo()) 

और यह अजगर उत्पादन जब यह चलती है:

Traceback (most recent call last): 
    File "./foo.py", line 12, in <module> 
    def foo2() -> OrderedDict[str, int]: 
TypeError: 'type' object is not subscriptable 

Mypy तथापि टिप्पणी में टाइप टिप्पणी के साथ कोई समस्या नहीं है और वास्तव में अगर मैं कोशिश चेतावनी देगा result[123] = 123 करने के लिए।

इसका कारण क्या है?

+1

अब यह काम करता है (mypy संस्करण 0.501)। – max

उत्तर

5

mypy में कम से कम कोई समस्या नहीं है (कम से कम, 0.501 में नहीं)। लेकिन पायथन 3.6.0 के साथ एक समस्या है। निम्नलिखित पर विचार करें:

from collections import OrderedDict 
from typing import Dict 

def foo() -> Dict[str, int]: 
    result: OrderedDict[str, int] = OrderedDict() 
    result['two'] = 2 
    return result 

इस कोड को दोनों mypy (0.501) और अजगर (3.6.0) को संतुष्ट करेगा। हालांकि, यदि आप Dict को OrderedDict के साथ प्रतिस्थापित करते हैं, तो मैपी अभी भी खुश होगी, लेकिन इसे निष्पादित करने से TypeError: 'type' object is not subscriptable के साथ मर जाएगा।

यह दिलचस्प है कि पाइथन दुभाषिया फ़ंक्शन हस्ताक्षर में एक सब्स्क्रिप्टेड OrderedDict को देखने पर मर जाता है, लेकिन इसे एक चर प्रकार के एनोटेशन में स्वीकार करने में प्रसन्नता हो रही है।

किसी भी दर पर, इसके लिए मेरा कामकाज Dict को OrderedDict के बजाय फ़ंक्शन हस्ताक्षर में उपयोग करना है (और एक टिप्पणी जोड़ें कि यह निर्धारित किया जाना चाहिए कि जब पाइथन दुभाषिया सही हस्ताक्षर स्वीकार करना सीख लेता है)।

+1

हाँ, मैं अपने कोड में एक ही कामकाज का उपयोग कर समाप्त हुआ। – Xarn

1

क्या आप भी MutableMapping उपयोग कर रहा है कोशिश कर सकते हैं (इस जवाब में की तरह: https://stackoverflow.com/a/44167921/1386610)

from collections import OrderedDict 
from typing import Dict 

def foo() -> MutableMapping[str, int]: 
    result = OrderedDict() # type: MutableMapping[str, int] 
    result['foo'] = 123 
    return result 
संबंधित मुद्दे