Làm cách nào để chú thích các loại trong vòng lặp for


93

Tôi muốn chú thích một loại biến trong for-loop. Tôi đã thử điều này:

for i: int in range(5):
    pass

Nhưng rõ ràng là nó đã không hoạt động.

Điều tôi mong đợi là tính năng tự động hoàn thành hoạt động trong PyCharm 2016.3.2. Chú thích trước như thế này:

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

không giúp ích gì.

PS Pre-annotation hoạt động cho PyCharm> = 2017.1


Chỉ cần lưu ý: Thông thường bạn không cần nó vì kiểu được suy ra từ hàm phạm vi (điều này có liên quan cho tất cả các biến được khai báo nội bộ)
gdoumenc

Câu trả lời:


124

Theo PEP 526 , điều này không được phép:

Ngoài ra, người ta không thể chú thích các biến được sử dụng trong một forhoặc with câu lệnh ; chúng có thể được chú thích trước, theo cách tương tự như việc giải nén

Chú thích nó trước vòng lặp:

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

PyCharm 2018.1 trở lên hiện nhận dạng được loại biến bên trong vòng lặp. Điều này không được hỗ trợ trong các phiên bản PyCharm cũ hơn.


1
Tôi đã thử nó, nhưng có vẻ như nó không hoạt động trong PyCharm ổn định cuối cùng. Tôi không nhận được bất kỳ tự động hoàn thành nào ít nhất.
grepcake

2
Tôi đang sử dụng PyCharm 2018.1 và hiện nó nhận dạng được biểu mẫu này.
philologon

2
@philologon hay quá! Cảm ơn vì đã cập nhật câu trả lời phù hợp.
alecxe

3
Nhưng sẽ có một thông tin thanh tra Local variable 'i' value is not used.
Simin Jie

1
Các itại i: intsẽ vẫn không được sử dụng ngay cả khi bạn sử dụng itrong vòng lặp. Tôi nghĩ đây là một thiếu sót cho loại chú thích này.
Simin Jie

38

Tôi không biết giải pháp này có tương thích với PEP không hay chỉ là một tính năng của PyCharm nhưng tôi đã làm cho nó hoạt động như thế này

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

và tôi đang sử dụng Pycharm Community Edition 2016.2.1


2
Cảm ơn bạn, nhưng tôi sẽ dính vào các tùy chọn PEP 526
grepcake

Mặc dù không tuân thủ PEP 526, nhưng điều này hoạt động trong PyCharm (ít nhất là 2017.2.1) và có thêm lợi ích là cũng hoạt động trong Python 3.0-3.5 (không hỗ trợ cú pháp chú thích trước được giới thiệu trong Python 3.6).
phoenix

4
FYI: Định dạng này được cho phép / đề cập rõ ràng trong PEP 484 (cũng tương thích với python 2.7)
Claude

1
Đây cũng là một lựa chọn hợp lệ theo PEP 484
Marco

Hình thức này cũng làm việc với cho / vòng enumerate và PyCharm năm 2018. ví dụfor index, area in enumerate(area_list): # type: int, AreaInfo
simpleuser

13

Điều này hoạt động tốt cho tôi trong PyCharm (sử dụng Python 3.6)

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

Tôi nghĩ rằng đây phải là câu trả lời được chấp nhận, vì điều này thực hiện chính xác những gì được yêu cầu và không đưa ra các lỗi và / hoặc cảnh báo khác, trái ngược với câu trả lời hiện được chấp nhận.
Jani Kärkkäinen

2
MyPy thực sự phàn nàn nếu bạn xác định lại biến trong vòng lặp for
Giovanni Di Milia

3
Không xác định lại biến. i: intlà đủ và bạn sẽ không nhận được bất kỳ phàn nàn nào.
user136036 Ngày

-4

Không có câu trả lời nào ở đây hữu ích, ngoại trừ việc nói rằng bạn không thể. Ngay cả câu trả lời được chấp nhận cũng sử dụng cú pháp từ tài liệu PEP 526, đây không phải là cú pháp python hợp lệ. Nếu bạn cố gắng gõ vào

x: int

Bạn sẽ thấy đó là lỗi cú pháp.

Đây là một giải pháp hữu ích:

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

Làm công việc của bạn với x. PyCharm nhận dạng loại của nó và tự động hoàn thành hoạt động.


10
Nó là cú pháp hợp lệ, ít nhất, cho python 3.6. Xem PEP 526
grepcake
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.