Chú thích loại thuộc tính lớp python

Tôi là nhà nghiên cứu và phát triển web tự do đến từ Malawi. Tôi thích học những điều mới và việc viết lách giúp tôi hiểu và củng cố các khái niệm. Tôi hy vọng bằng cách chia sẻ kinh nghiệm của mình, những người khác có thể học được điều gì đó từ họ

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"
    
    8

  • Trì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]]
    
    0

    Có 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.

__ chú thích __ trong Python là gì?

__annotations__ đối tượng sẽ tạo một lệnh trống mới mà nó sẽ lưu trữ và trả về dưới dạng chú thích của nó . Việc xóa các chú thích trên một hàm trước khi nó lười biếng tạo các chú thích của nó dict sẽ tạo ra một AttributeError ; .

Bạn có thể chỉ định loại trong Python không?

Chỉ định Loại biến . Điều này có thể được thực hiện bằng cách truyền . Python là một ngôn ngữ hướng đối tượng và do đó, nó sử dụng các lớp để xác định các kiểu dữ liệu, bao gồm cả các kiểu nguyên thủy của nó.

PEP 484 là gì?

PEP 484 – Gợi ý nhập - Đề xuất cải tiến Python . PEP này nhằm mục đích cung cấp một cú pháp tiêu chuẩn cho các chú thích kiểu, mở mã Python để phân tích và tái cấu trúc tĩnh dễ dàng hơn, thời gian chạy tiềm năng. Đọc thêm > Gõ gợi ý cheat sheet [Python 3] - mypy 0. tài liệu 982.

Bạn có nên sử dụng chú thích kiểu Python không?

Gợi ý nhập hoạt động tốt nhất trong Pythons hiện đại . Chú thích đã được giới thiệu trong Python 3. 0 và có thể sử dụng nhận xét loại trong Python 2. 7. Tuy nhiên, những cải tiến như chú thích biến và hoãn đánh giá gợi ý loại có nghĩa là bạn sẽ có trải nghiệm tốt hơn khi thực hiện kiểm tra loại bằng Python 3. 6 hoặc thậm chí Python 3. 7.

Chủ Đề