ฉันจะใส่คำอธิบายประกอบประเภทใน for-loop ได้อย่างไร


93

ฉันต้องการใส่คำอธิบายประกอบประเภทของตัวแปรในfor-loop ฉันลองสิ่งนี้:

for i: int in range(5):
    pass

แต่มันไม่ได้ผลแน่นอน

สิ่งที่ฉันคาดหวังคือการเติมข้อความอัตโนมัติใน PyCharm 2016.3.2 คำอธิบายประกอบล่วงหน้าเช่นนี้:

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

ไม่ได้ช่วย

คำอธิบายประกอบล่วงหน้าของ PS ใช้ได้กับ PyCharm> = 2017.1


เพียงข้อสังเกต: โดยปกติคุณไม่ควรจำเป็นต้องใช้เนื่องจากประเภทถูกอนุมานจากฟังก์ชัน range (สิ่งนี้เกี่ยวข้องกับตัวแปรที่ประกาศภายในทั้งหมด)
gdoumenc

คำตอบ:


124

ตามPEP 526สิ่งนี้ไม่ได้รับอนุญาต:

นอกจากนี้หนึ่งไม่สามารถตัวแปรคำอธิบายประกอบใช้ในforหรือwith คำสั่ง ; สามารถใส่คำอธิบายประกอบล่วงหน้าได้ในลักษณะที่คล้ายกับการแกะกล่อง

ใส่คำอธิบายประกอบก่อนลูป:

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

PyCharm 2018.1 ขึ้นไปรู้จักประเภทของตัวแปรภายในลูปแล้ว สิ่งนี้ไม่ได้รับการสนับสนุนใน PyCharm เวอร์ชันเก่า


1
ฉันลองแล้ว แต่ดูเหมือนว่าจะใช้งานไม่ได้ใน PyCharm ที่เสถียรล่าสุด ฉันไม่ได้รับการเติมข้อความอัตโนมัติเลยแม้แต่น้อย
grepcake

2
ฉันใช้ PyCharm 2018.1 และตอนนี้รู้จักแบบฟอร์มนี้แล้ว
philologon

2
@philologon ดี! ขอขอบคุณที่ทราบข้อมูลอัปเดตคำตอบตามนี้
alecxe

3
Local variable 'i' value is not usedแต่จะมีการตรวจสอบข้อมูล
Simin Jie

1
iในi: intจะยังคงไม่ได้รับการใช้งานได้ที่คุณใช้iในวง ฉันคิดว่านี่เป็นข้อบกพร่องสำหรับคำอธิบายประกอบประเภทนี้
Simin Jie

38

ฉันไม่รู้ว่าโซลูชันนี้เข้ากันได้กับ PEP หรือเป็นเพียงคุณสมบัติของ PyCharm แต่ฉันทำให้มันใช้งานได้เช่นนี้

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

และฉันใช้ Pycharm Community Edition 2016.2.1


2
ขอบคุณ แต่ฉันจะใช้ตัวเลือก PEP 526
grepcake

แม้ว่าจะไม่เป็นไปตามข้อกำหนด PEP 526 แต่ก็ใช้ได้ใน PyCharm (อย่างน้อยในปี 2017.2.1) และมีประโยชน์เพิ่มเติมจากการทำงานใน Python 3.0-3.5 (ซึ่งไม่รองรับไวยากรณ์คำอธิบายประกอบล่วงหน้าที่แนะนำใน Python 3.6)
ต้นอินทผลัม

4
FYI: รูปแบบนี้ได้รับอนุญาตอย่างชัดเจน / กล่าวถึงใน PEP 484 (ใช้ร่วมกับ python 2.7 ได้ด้วย)
Claude

1
นอกจากนี้ยังเป็นตัวเลือกที่ถูกต้องตามPEP 484
Marco

แบบฟอร์มนี้ยังใช้ได้กับสำหรับ / แจงนับลูปและ PyCharm 2018 เช่นfor index, area in enumerate(area_list): # type: int, AreaInfo
simpleuser

13

สิ่งนี้ใช้ได้ดีสำหรับฉันใน PyCharm (โดยใช้ Python 3.6)

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

ฉันคิดว่านี่ควรเป็นคำตอบที่ได้รับการยอมรับเนื่องจากทำตามที่ร้องขออย่างแท้จริงและไม่ให้ข้อผิดพลาดและ / หรือคำเตือนอื่น ๆ ซึ่งต่างจากข้อผิดพลาดที่ยอมรับในปัจจุบัน
Jani Kärkkäinen

2
MyPy บ่นจริงๆถ้าคุณกำหนดตัวแปรใหม่ใน for loop
Giovanni Di Milia

3
อย่ากำหนดตัวแปรใหม่ i: intก็เพียงพอแล้วและคุณจะไม่ได้รับการร้องเรียนใด ๆ
user136036

-4

ไม่มีคำตอบใดที่เป็นประโยชน์นอกจากจะบอกว่าคุณทำไม่ได้ แม้แต่คำตอบที่ยอมรับก็ใช้ไวยากรณ์จากเอกสาร PEP 526 ซึ่งไม่ใช่ไวยากรณ์ของ python ที่ถูกต้อง หากคุณพยายามพิมพ์

x: int

คุณจะเห็นว่าเป็นข้อผิดพลาดทางไวยากรณ์

นี่คือวิธีแก้ปัญหาที่มีประโยชน์:

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

ทำงานของคุณด้วยx. PyCharm รู้จักประเภทของมันและการเติมข้อความอัตโนมัติทำงานได้


10
เป็นไวยากรณ์ที่ถูกต้องอย่างน้อยสำหรับ python 3.6 ดูPEP 526
grepcake
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.