Nhập gợi ý danh sách một loại được chỉ định


128

Sử dụng chú thích hàm của Python 3, có thể chỉ định loại mục chứa trong danh sách đồng nhất (hoặc bộ sưu tập khác) cho mục đích gợi ý kiểu trong PyCharm và các IDE khác không?

Ví dụ về mã pseudo-python cho danh sách int:

def my_func(l:list<int>):
    pass

Tôi biết có thể sử dụng Docstring ...

def my_func(l):
    """
    :type l: list[int]
    """
    pass

... nhưng tôi thích kiểu chú thích hơn nếu có thể.


Bạn đã thử sử dụng cùng một định dạng trong các chú thích hàm chưa? Chuyện gì đã xảy ra?
jonrsharpe

@jonrsharpe Nó sẽ phát sinh lỗi vì type object is not subscriptablekhi xác định hàm. Rõ ràng, bạn có thể sử dụng một chuỗi: def my_func(L: 'list[int]')nhưng tôi không biết liệu PyCharm sẽ phân tích nó vì nó phân tích các docstrings ...
Bakuriu

@Bakuriu vâng, ý tôi là 'list[int]', xin lỗi nếu điều đó không rõ ràng.
jonrsharpe

Có vẻ như PyCharm sẽ phân tích cú pháp nó giống như docstrings.
Eric W.

Câu trả lời:


161

Trả lời câu hỏi của riêng tôi; câu trả lời TLDR là Không .

Cập nhật 2

Vào tháng 9 năm 2015, Python 3.5 đã được phát hành với hỗ trợ Gợi ý và bao gồm một mô-đun đánh máy mới . Điều này cho phép đặc tả các kiểu chứa trong các bộ sưu tập. Kể từ tháng 11 năm 2015, JetBrains PyCharm 5.0 hỗ trợ đầy đủ Python 3.5 bao gồm Gợi ý kiểu như minh họa bên dưới.

Hoàn thành mã PyCharm 5.0 bằng cách sử dụng Gợi ý loại

Cập nhật 1

Kể từ tháng 5 năm 2015, PEP0484 (Gợi ý Loại) đã được chính thức chấp nhận. Việc triển khai dự thảo cũng có sẵn trên github dưới dạng ambv / typehinting .

Câu trả lời gốc

Kể từ tháng 8 năm 2014, tôi đã xác nhận rằng không thể sử dụng chú thích kiểu Python 3 để chỉ định các loại trong bộ sưu tập (ví dụ: danh sách các chuỗi).

Việc sử dụng các chuỗi tài liệu được định dạng như reStructuredText hoặc Sphinx là những lựa chọn thay thế khả thi và được hỗ trợ bởi các IDE khác nhau.

Có vẻ như Guido đang nghiền ngẫm ý tưởng mở rộng chú thích kiểu theo tinh thần của mypy: http://mail.python.org/pipermail/python-ideas/2014-August/028618.html


Cập nhật: Dường như loại gián tiếp bao gồm hỗ trợ cho kiểu generic đã làm theo cách của mình để PEP484 python.org/dev/peps/pep-0484
Eric W.

74

Bây giờ Python 3.5 đã chính thức ra mắt, có mô-đun hỗ trợ Type Hints - typingList "loại" cho các vùng chứa chung.

Nói cách khác, bây giờ bạn có thể làm:

from typing import List

def my_func(l: List[int]):
    pass

10

Loại nhận xét đã được thêm vào kể từ PEP 484

from . import Monitor
from typing import List, Set, Tuple, Dict


active_monitors = [] # type: List[Monitor]
# or
active_monitors: List[Monitor] = []

# bonus
active_monitors: Set[Monitor] = set()
monitor_pair: Tuple[Monitor, Monitor] = (Monitor(), Monitor())
monitor_dict: Dict[str, Monitor] = {'codename': Monitor()}

# nested
monitor_pair_list: List[Dict[str, Monitor]] = [{'codename': Monitor()}]

Điều này hiện đang làm việc cho tôi trên PyCharm với Python 3.6.4

Hình ảnh ví dụ trong Pycharm


4

Với sự hỗ trợ từ BDFL, bây giờ gần như chắc chắn rằng python (có thể là 3.5) sẽ cung cấp một cú pháp chuẩn hóa cho các gợi ý kiểu thông qua chú thích hàm.

https://www.python.org/dev/peps/pep-0484/

Như đã đề cập trong PEP, có một trình kiểm tra kiểu thử nghiệm (giống như pylint, nhưng dành cho các loại) được gọi là mypy đã sử dụng tiêu chuẩn này và không yêu cầu bất kỳ cú pháp mới nào.

http://mypy-lang.org/


3

Kể từ Python 3.9, các kiểu nội trang là chung đối với chú thích kiểu (xem PEP 585 ). Điều này cho phép chỉ định trực tiếp loại phần tử:

def my_func(l: list[int]):
    pass

Nhiều công cụ khác nhau có thể hỗ trợ cú pháp này sớm hơn Python 3.9. Khi chú thích không được kiểm tra trong thời gian chạy, cú pháp hợp lệ bằng cách sử dụng trích dẫn hoặc __future__.annotations.

# quoted
def my_func(l: 'list[int]'):
    pass
# postponed evaluation of annotation
from __future__ import annotations

def my_func(l: list[int]):
    pass
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.