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


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.


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


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

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.


10
Ini adalah sintaks yang valid, setidaknya, untuk python 3.6. Lihat PEP 526
grepcake
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.