Bagaimana cara membuat anotasi tipe dalam for-loop

93

Saya ingin membuat anotasi jenis variabel di for-loop. Saya mencoba ini:

for i: int in range(5):
    pass

Tapi itu tidak berhasil, jelas.

Yang saya harapkan adalah berfungsi pelengkapan otomatis di PyCharm 2016.3.2. Pranotasi seperti ini:

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

tidak membantu.

Pranotasi PS berfungsi untuk PyCharm> = 2017.1

grepcake
sumber
Hanya sebuah komentar: Biasanya Anda tidak memerlukannya karena jenisnya disimpulkan dari fungsi range (ini relevan untuk semua variabel yang dideklarasikan internal)
gdoumenc

Jawaban:

124

Menurut PEP 526 , ini tidak diperbolehkan:

Selain itu, seseorang tidak dapat menjelaskan variabel yang digunakan dalam pernyataan foratauwith ; mereka dapat diberi anotasi sebelumnya, dengan cara yang mirip dengan tuple unpacking

Beri anotasi sebelum loop:

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

PyCharm 2018.1 dan yang lebih baru sekarang mengenali jenis variabel di dalam loop. Ini tidak didukung di versi PyCharm yang lebih lama.

alecxe
sumber
1
Saya mencobanya, tetapi tampaknya tidak berfungsi di PyCharm stabil terakhir. Setidaknya saya tidak mendapatkan pelengkapan otomatis.
grepcake
2
Saya menggunakan PyCharm 2018.1 dan sekarang ia mengenali formulir ini.
philologon
2
@philologon bagus! Terima kasih atas perhatiannya, perbarui jawabannya.
alecxe
3
Tapi akan ada info pemeriksaan Local variable 'i' value is not used.
Simin Jie
1
The idalam i: intakan tetap tidak digunakan bahkan Anda gunakan idalam lingkaran. Saya pikir ini adalah kekurangan untuk anotasi semacam ini.
Simin Jie
38

Saya tidak tahu apakah solusi ini kompatibel dengan PEP atau hanya fitur PyCharm tetapi saya membuatnya berfungsi seperti ini

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

dan saya menggunakan Pycharm Community Edition 2016.2.1

David Vasquez
sumber
2
Terima kasih, tapi saya akan tetap menggunakan opsi PEP 526
grepcake
Meskipun tidak sesuai dengan PEP 526, ini berfungsi di PyCharm (setidaknya pada 2017.2.1) dan memiliki manfaat tambahan juga bekerja di Python 3.0-3.5 (yang tidak mendukung sintaks anotasi pra-diperkenalkan di Python 3.6).
phoenix
4
FYI: Format ini secara eksplisit diperbolehkan / disebutkan dalam PEP 484 (juga harus kompatibel dengan python 2.7)
Claude
1
Ini juga merupakan opsi yang valid menurut PEP 484
Marco
Formulir ini juga berfungsi dengan for / enumerate loop dan PyCharm 2018. misfor index, area in enumerate(area_list): # type: int, AreaInfo
simpleuser
13

Ini bekerja dengan baik untuk saya di PyCharm (menggunakan Python 3.6)

for i in range(5):
    i: int = i
    pass
Samir
sumber
Saya pikir ini harus menjadi jawaban yang diterima, karena ini melakukan persis apa yang diminta dan tidak memberikan kesalahan dan / atau peringatan lain, berbeda dengan yang diterima saat ini.
Jani Kärkkäinen
2
MyPy sebenarnya mengeluh jika Anda mendefinisikan ulang variabel di loop for
Giovanni Di Milia
3
Jangan mendefinisikan ulang variabel. i: intsudah cukup dan Anda tidak akan mendapat keluhan.
pengguna136036
-4

Tidak ada tanggapan di sini yang berguna, kecuali untuk mengatakan bahwa Anda tidak bisa. Bahkan jawaban yang diterima menggunakan sintaks dari dokumen PEP 526, yang bukan sintaks python yang valid. Jika Anda mencoba mengetik

x: int

Anda akan melihat itu kesalahan sintaks.

Berikut adalah solusi yang berguna:

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

Lakukan pekerjaan Anda dengan x. PyCharm mengenali tipenya, dan pelengkapan otomatis berfungsi.

Edward Ned Harvey
sumber
10
Ini adalah sintaks yang valid, setidaknya, untuk python 3.6. Lihat PEP 526
grepcake