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


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.