मैं फॉर-लूप में कैसे एनोटेट करता हूं


100

मैं एक forलूप में एक प्रकार के चर का एनोटेट करना चाहता हूं । मैंने यह कोशिश की:

for i: int in range(5):
    pass

लेकिन यह काम नहीं किया, जाहिर है।

मुझे उम्मीद है कि PyCharm 2016.3.2 में स्वत: पूर्ण काम कर रहा है। इस तरह से पूर्व-टिप्पणी:

i: int
for i in range(5):
    pass

मदद नहीं करता है।

पीएस प्री-एनोटेशन PyCharm> = 2017.1 के लिए काम करता है


बस एक टिप्पणी: आम तौर पर आपको इसकी आवश्यकता नहीं होनी चाहिए क्योंकि रेंज फ़ंक्शन से टाइप किया जाता है (यह सभी आंतरिक घोषित चर के लिए प्रासंगिक है)
gdoumenc

जवाबों:


133

PEP 526 के अनुसार , इसकी अनुमति नहीं है:

इसके अलावा, कोई एक forया with कथन में प्रयुक्त चर का सत्यानाश नहीं कर सकता है ; उन्हें समय से पहले एनोटेट किया जा सकता है, एक समान तरीके से अनपैकिंग करने के लिए

लूप से पहले इसे एनोटेट करें:

i: int
for i in range(5):
    pass

PyCharm 2018.1 और ऊपर अब लूप के अंदर चर के प्रकार को पहचानता है। पुराने PyCharm संस्करणों में इसका समर्थन नहीं किया गया था।


1
मैंने इसे आजमाया, लेकिन ऐसा लगता नहीं है कि यह अंतिम स्थिर पाइकर्म में काम कर रहा है। मुझे कम से कम कोई स्वतः पूर्णता नहीं मिलती है।
grepcake 18

2
मैं PyCharm 2018.1 का उपयोग कर रहा हूं और यह अब इस फॉर्म को पहचानता है।
दार्शनिक

2
@philologon अच्छा! सिर के लिए धन्यवाद, तदनुसार अद्यतन किया गया।
एलिक्से

3
लेकिन एक निरीक्षण जानकारी होगी Local variable 'i' value is not used
सिमिन जी

1
iमें i: intअभी भी नहीं इस्तेमाल किया जाएगा आप का उपयोग iपाश में। मुझे लगता है कि यह इस तरह की टिप्पणी के लिए एक दोष है।
सिमिन जी

39

मुझे नहीं पता कि यह समाधान PEP संगत है या PyCharm की एक विशेषता है, लेकिन मैंने इसे इस तरह से काम किया है

for i in range(5): #type: int
  pass

और मैं Pycharm सामुदायिक संस्करण 2016.2.1 का उपयोग कर रहा हूं


2
धन्यवाद, लेकिन मैं PEP 526 के विकल्प पर
टिक जाऊंगा

जबकि PEP 526 का अनुपालन नहीं है, यह PyCharm (कम से कम 2017.2.1 के रूप में) में काम करता है और इसे Python 3.0-3.5 में काम करने का अतिरिक्त लाभ भी है (जो पायथन 3.6 में पेश किए गए प्री-एनोटेशन सिंटैक्स का समर्थन नहीं करता है)।
फीनिक्स

5
FYI करें: इस प्रारूप को PEP 484 में स्पष्ट रूप से अनुमति दी गई है / उल्लेख किया गया है (यह भी अजगर 2.7 संगत होना चाहिए)
क्लाउड


यह फॉर्म 2018 के लिए / enumerate loops और PyCharm के लिए भी काम करता है। उदाहरण के लिएfor index, area in enumerate(area_list): # type: int, AreaInfo
simpleuser

13

यह PyCharm (पायथन 3.6 का उपयोग करके) में मेरे लिए अच्छा काम करता है

for i in range(5):
    i: int = i
    pass

मुझे लगता है कि यह स्वीकृत उत्तर होना चाहिए, क्योंकि यह वही है जो अनुरोध किया गया था और वर्तमान में स्वीकृत एक के विपरीत अन्य त्रुटियों और / या चेतावनियों को नहीं देता है।
जानी कर्णकिन

2
MyPy वास्तव में शिकायत करता है यदि आप लूप के लिए चर को फिर से परिभाषित करते हैं
Giovanni Di Milia

3
चर को फिर से परिभाषित न करें। i: intपर्याप्त है और आपको कोई शिकायत नहीं मिलेगी।
user136036

-4

यहां कोई भी प्रतिक्रिया उपयोगी नहीं थी, सिवाय इसके कि आप नहीं कर सकते। यहां तक ​​कि स्वीकृत उत्तर PEP 526 दस्तावेज़ से वाक्यविन्यास का उपयोग करता है, जो मान्य पायथन वाक्यविन्यास नहीं है। यदि आप टाइप करने की कोशिश करते हैं

x: int

आप देखेंगे कि यह एक सिंटैक्स त्रुटि है।

यहाँ एक उपयोगी समाधान है:

for __x in range(5):
    x = __x  # type: int
    print(x)

अपना काम करो x। PyCharm अपने प्रकार, और स्वत: पूर्ण कार्यों को पहचानता है।


10
यह कम से कम अजगर 3.6 के लिए वैध सिंटैक्स है। PEP 526
grepcake

1
बिल्कुल गलत नहीं है, लेकिन यह प्यार के बिना कोडिंग है;)
सिंह 15
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.