attrs đi kèm với hỗ trợ hạng nhất cho các chú thích loại cho cả Python 3. 6 [PEP 526] và cú pháp kế thừa
Tuy nhiên, chúng sẽ mãi mãi là tùy chọn, do đó, ví dụ từ README cũng có thể được viết là
>>> from attrs import define, field >>> @define .. class SomeClass: .. a_number = field[default=42] .. list_of_numbers = field[factory=list] >>> sc = SomeClass[1, [1, 2, 3]] >>> sc SomeClass[a_number=1, list_of_numbers=[1, 2, 3]]
Bạn có thể tự do lựa chọn giữa các phương pháp, nhưng hãy nhớ rằng nếu bạn chọn sử dụng chú thích loại, bạn phải chú thích tất cả các thuộc tính
Ngay cả khi sử dụng tất cả các chú thích loại, bạn sẽ cần
$ mypy t.py t.py:12: error: Argument 1 to "SomeClass" has incompatible type "str"; expected "int"5 cho một số tính năng nâng cao
Một trong những tính năng đó là các tính năng dựa trên trang trí như mặc định. Điều quan trọng cần nhớ là attrs không làm bất kỳ điều kỳ diệu nào sau lưng bạn. Tất cả các bộ trang trí được triển khai bằng cách sử dụng một đối tượng được trả về bằng lệnh gọi tới
$ mypy t.py t.py:12: error: Argument 1 to "SomeClass" has incompatible type "str"; expected "int"5
Các thuộc tính chỉ mang một chú thích lớp không có đối tượng đó nên cố gắng gọi một phương thức trên đó chắc chắn sẽ thất bại
Xin lưu ý rằng các loại - bất kể được thêm vào như thế nào - chỉ là siêu dữ liệu có thể được truy vấn từ lớp và chúng không được sử dụng cho bất kỳ mục đích gì ngoài hộp
Bởi vì Python không cho phép tham chiếu đến một đối tượng lớp trước khi lớp được định nghĩa, các kiểu có thể được định nghĩa là chuỗi ký tự, được gọi là tham chiếu chuyển tiếp [PEP 526]. Bạn có thể tự động bật tính năng này cho toàn bộ mô-đun bằng cách sử dụng
$ mypy t.py t.py:12: error: Argument 1 to "SomeClass" has incompatible type "str"; expected "int"7 [PEP 563] kể từ Python 3. 7. Trong trường hợp này, attrs chỉ cần đặt các ký tự chuỗi này vào thuộc tính
$ mypy t.py t.py:12: error: Argument 1 to "SomeClass" has incompatible type "str"; expected "int"8. Nếu bạn cần giải quyết những điều này thành các loại thực, bạn có thể gọi
$ mypy t.py t.py:12: error: Argument 1 to "SomeClass" has incompatible type "str"; expected "int"9 sẽ cập nhật thuộc tính tại chỗ
Tuy nhiên, trên thực tế, các loại thể hiện tính hữu ích lớn nhất của chúng khi kết hợp với các công cụ như Mypy, pytype hoặc Pyright có hỗ trợ riêng cho các lớp attrs
Việc bổ sung các loại tĩnh chắc chắn là một trong những tính năng thú vị nhất trong hệ sinh thái Python và giúp bạn viết mã tự ghi lại chính xác và đã được xác minh
Nếu bạn không biết bắt đầu từ đâu, Carl Meyer đã có một bài nói chuyện tuyệt vời về Python được kiểm tra kiểu trong Thế giới thực tại PyCon US 2018 sẽ giúp bạn bắt đầu ngay lập tức
mypy#
Mặc dù có một cú pháp hay cho siêu dữ liệu loại là điều tuyệt vời, nhưng Mypy kể từ 0 thậm chí còn tuyệt vời hơn. 570 đi kèm với plugin attrs chuyên dụng cho phép bạn kiểm tra tĩnh mã của mình
Hãy tưởng tượng bạn thêm một dòng khác cố gắng khởi tạo lớp đã xác định bằng cách sử dụng
@attr.s class SomeClass: a_number = attr.ib[default=42] # type: int list_of_numbers = attr.ib[factory=list, type=list[int]]0. Mypy sẽ bắt lỗi đó cho bạn
$ mypy t.py t.py:12: error: Argument 1 to "SomeClass" has incompatible type "str"; expected "int"
Điều này xảy ra mà không cần chạy mã của bạn
Và nó cũng hoạt động với cả các kiểu chú thích Python 2 kiểu. Đối với Mypy, mã này tương đương với mã ở trên
@attr.s class SomeClass: a_number = attr.ib[default=42] # type: int list_of_numbers = attr.ib[factory=list, type=list[int]]
Pyright#
attrs cung cấp hỗ trợ cho Pyright mặc dù thông số kỹ thuật của
$ mypy t.py t.py:12: error: Argument 1 to "SomeClass" has incompatible type "str"; expected "int"0. Điều này cung cấp suy luận loại tĩnh cho một tập hợp con của attrs tương đương với thư viện tiêu chuẩn
$ mypy t.py t.py:12: error: Argument 1 to "SomeClass" has incompatible type "str"; expected "int"1 và yêu cầu chú thích loại rõ ràng bằng cách sử dụng API
$ mypy t.py t.py:12: error: Argument 1 to "SomeClass" has incompatible type "str"; expected "int"2 hoặc
$ mypy t.py t.py:12: error: Argument 1 to "SomeClass" has incompatible type "str"; expected "int"3
Đưa ra định nghĩa sau, Pyright sẽ tạo chữ ký kiểu tĩnh cho truy cập thuộc tính
$ mypy t.py t.py:12: error: Argument 1 to "SomeClass" has incompatible type "str"; expected "int"4,
$ mypy t.py t.py:12: error: Argument 1 to "SomeClass" has incompatible type "str"; expected "int"5,
$ mypy t.py t.py:12: error: Argument 1 to "SomeClass" has incompatible type "str"; expected "int"6 và các phương pháp so sánh
$ mypy t.py t.py:12: error: Argument 1 to "SomeClass" has incompatible type "str"; expected "int"0
Cảnh báo
Các kiểu suy luận Pyright là một tập hợp con nhỏ của những kiểu được Mypy hỗ trợ, bao gồm
Chữ ký
$ mypy t.py t.py:12: error: Argument 1 to "SomeClass" has incompatible type "str"; expected "int"
5 được tạo chỉ bao gồm các chú thích loại thuộc tính. Nó hiện không bao gồm các loại thuộc tính$ mypy t.py t.py:12: error: Argument 1 to "SomeClass" has incompatible type "str"; expected "int"
8Trình trang trí
$ mypy t.py t.py:12: error: Argument 1 to "SomeClass" has incompatible type "str"; expected "int"
9 không được nhập với các thuộc tính cố định, được nhập đúng thông qua@attr.s class SomeClass: a_number = attr.ib[default=42] # type: int list_of_numbers = attr.ib[factory=list, type=list[int]]
0Có thể tìm thấy danh sách đầy đủ các giới hạn và tính không tương thích trong kho lưu trữ của Pyright
Phản hồi mang tính xây dựng của bạn được hoan nghênh ở cả attrs#795 và pyright#1782. Nói chung, quyết định cải thiện hỗ trợ attrs trong Pyright hoàn toàn là đặc quyền của Microsoft.