क्या एक "के साथ" बयान प्रकार संकेत का समर्थन करता है?


16

क्या आप withसिंटैक्स के साथ परिभाषित चर के लिए प्रकार संकेत को परिभाषित कर सकते हैं ?

with example() as x:
    print(x)

मैं उपरोक्त संकेत देना चाहूंगा कि xयह कहना strएक उदाहरण के रूप में है।

केवल एक ही काम जो मैंने पाया है वह एक मध्यवर्ती चर का उपयोग करना है, लेकिन यह हैकिंग लगता है।

with example() as x:
    y: str = x
    print(y)

मैं टाइपिंग प्रलेखन में एक उदाहरण नहीं मिल सकता है ।


6
xवापसी के प्रकार के रूप में कांटा टाइप चेकर्स नहीं कर सकते हैं example().__enter__()?
Psillill

2
xजब आप केवल वापसी प्रकार चाहते हैं, तो आप एनोटेट क्यों करना चाहते हैं example.__enter__? आदर्श रूप से आपने उस विधि / कार्य को एनोटेट किया है।
a_guest

1
xका वापसी मूल्य नहीं है example; इसका रिटर्न वैल्यू है example().__enter__()
चेपनर

अधिकांश तरीकों से मैंने पाया है कि वापसी के मूल्य के लिए एक प्रकार का संकेत नहीं है।
रिएक्टगुलर

1
@Reactgular तब समाधान उस फ़ंक्शन के लिए एक स्टब फ़ाइल बनाने के लिए होता है, इसलिए टाइप चेकर प्रकार का अनुमान लगा सकता है। आमतौर पर आप एपीआई सीमाओं पर एनोटेट करते हैं, अंदर नहीं। इस मामले में यह स्पष्ट है कि टाइप कहां से आता है example। एनोटेटिंग का example.__enter__अर्थ है एक एनोटेशन जबकि आपके दृष्टिकोण के साथ आपको उन सभी स्थानों पर एनोटेट करना होगा जहां उस संदर्भ प्रबंधक का उपयोग किया जाता है, साथ ही साथ सामान्य रूप से उपयोगकर्ता को यह कैसे पता चलता है कि एपीआई का वापसी प्रकार वैसे भी है यदि आपूर्ति नहीं की जाती है?
a_guest

जवाबों:


11

PEP 526, जिसे पायथन 3.6 में लागू किया गया है, आपको चर को एनोटेट करने की अनुमति देता है। आप उपयोग कर सकते हैं, उदाहरण के लिए,

x: str
with example() as x:
    [...]

या

with example() as x:
    x: str
    [...]

यह अन्य कोड ब्लॉक जैसे के लिए भी काम करता है for। शानदार जवाब, धन्यवाद।
रिएक्टगुलर

यदि संदर्भ प्रबंधक संकेत नहीं देता है कि क्या __enter__विधि वापस आएगी, तो टाइपिंग से xकोई उद्देश्य पूरा नहीं होगा । mypyखुशी से किसी भी प्रकार के मूल्य को बाध्य होने की अनुमति देगा x
चेपनर

@chepner हाँ आप सही हैं। PyCharm पहचानता xके रूप में strदोनों ही मामलों में, लेकिन mypyनहीं करता है।
Pschill

14

आमतौर पर टाइप एनोटेशन को एपीआई सीमाओं पर रखा जाता है। इस मामले में प्रकार से अनुमान लगाया जाना चाहिए example.__enter__। यदि वह फ़ंक्शन किसी प्रकार की घोषणा नहीं करता है, तो उस प्रकार के चेकर को टाइप करने में मदद करने के लिए समाधान एक संगत स्टब फ़ाइल बनाने के लिए है ।

विशेष रूप से इसका मतलब है .pyiकि मॉड्यूल के रूप में एक ही स्टेम के साथ एक फ़ाइल बनाना , जिसमें Exampleसे आयात किया गया था। फिर निम्नलिखित कोड जोड़ा जा सकता है:

class Example:
    def __enter__(self) -> str: ...
    def __exit__(self, exc_type, exc_value, exc_traceback) -> None: ...
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.