Python 2 có gợi ý kiểu không?

Kiểm tra hoặc gợi ý kiểu là một tính năng mới hơn của Python đã được thêm vào Python 3. 5. Gợi ý loại còn được gọi là chú thích loại. Gợi ý kiểu là thêm cú pháp đặc biệt vào các khai báo hàm và biến để cho nhà phát triển biết kiểu đối số hoặc biến đó là gì

Python không thực thi các gợi ý kiểu. Bạn vẫn có thể thay đổi các loại theo ý muốn trong Python vì điều này. Tuy nhiên, một số môi trường phát triển tích hợp, chẳng hạn như PyCharm, hỗ trợ gợi ý nhập và sẽ làm nổi bật các lỗi nhập. Bạn cũng có thể sử dụng một công cụ gọi là Mypy để kiểm tra đánh máy cho bạn. Bạn sẽ tìm hiểu thêm về công cụ đó sau trong bài viết này

Bạn sẽ được học về những điều sau đây

  • Ưu và nhược điểm của gợi ý loại
  • Gợi ý loại tích hợp / Chú thích biến
  • Gợi ý loại bộ sưu tập
  • Các giá trị gợi ý có thể là
    >>> from typing import List
    >>> names: List[str, str] = ['Mike', 'James']
    8
  • Loại chức năng gợi ý
  • Phải làm gì khi mọi thứ trở nên phức tạp
  • Các lớp học
  • người trang trí
  • Răng cưa
  • Gợi ý loại khác
  • Loại Nhận xét
  • Kiểm tra loại tĩnh

Bắt đầu nào

Ưu và nhược điểm của gợi ý loại

Có một số điều cần biết trước khi nhập gợi ý trong Python. Trước tiên hãy xem xét ưu điểm của loại gợi ý

  • Gợi ý nhập là cách hay để ghi lại mã của bạn ngoài các tài liệu
  • Gợi ý nhập có thể làm cho IDE và linters đưa ra phản hồi tốt hơn và tự động hoàn thành tốt hơn
  • Việc thêm các gợi ý về loại buộc bạn phải suy nghĩ về các loại, điều này có thể giúp bạn đưa ra quyết định đúng đắn trong quá trình thiết kế ứng dụng của mình

Tuy nhiên, thêm gợi ý loại không phải là tất cả cầu vồng và hoa hồng. Có một số nhược điểm

  • Mã này dài dòng hơn và khó viết hơn
  • Loại gợi ý thêm thời gian phát triển
  • Nhập gợi ý chỉ hoạt động trong Python 3. 5+. Trước đó, bạn phải sử dụng loại bình luận
  • Gợi ý loại có thể có một hình phạt nhỏ về thời gian khởi động trong mã sử dụng nó, đặc biệt nếu bạn nhập mô-đun
    >>> from typing import List
    >>> names: List[str, str] = ['Mike', 'James']
    9

Khi nào thì bạn nên sử dụng kiểu gợi ý?

  • Nếu bạn dự định viết các đoạn mã ngắn hoặc tập lệnh một lần, bạn không cần đưa vào gợi ý loại
  • Người mới bắt đầu cũng không cần thêm gợi ý kiểu khi học Python
  • Nếu bạn đang thiết kế một thư viện cho các nhà phát triển khác sử dụng, thì việc thêm gợi ý loại có thể là một ý kiến ​​hay
  • Các dự án Python lớn (i. e. hàng nghìn dòng mã) cũng có thể hưởng lợi từ gợi ý kiểu
  • Một số nhà phát triển cốt lõi khuyên bạn nên thêm gợi ý loại nếu bạn định viết bài kiểm tra đơn vị

Gợi ý kiểu là một chủ đề gây tranh cãi trong Python. Bạn không cần phải sử dụng nó mọi lúc, nhưng có một số trường hợp gợi ý loại sẽ hữu ích

Hãy dành phần còn lại của bài viết này để học cách sử dụng gợi ý loại

Gợi ý loại tích hợp / Chú thích biến

Bạn có thể thêm gợi ý loại với các loại tích hợp sau

Chúng có thể được sử dụng cả trong hàm và trong chú thích biến. Khái niệm về chú thích biến đã được thêm vào ngôn ngữ Python trong 3. 6. Chú thích biến cho phép bạn thêm gợi ý loại vào biến

Dưới đây là một số ví dụ

x: int  # a variable named x without initialization
y: float = 1.0  # a float variable, initialized to 1.0
z: bool = False
a: str = 'Hello type hinting'

Bạn có thể thêm một gợi ý kiểu vào một biến mà không cần khởi tạo nó, như trường hợp trong dòng mã đầu tiên. 3 dòng mã khác cho biết cách chú thích từng biến và khởi tạo chúng một cách thích hợp

Tiếp theo, hãy xem cách bạn thêm gợi ý loại cho các bộ sưu tập

Gợi ý loại trình tự

Bộ sưu tập là một nhóm các mục trong Python. Các bộ sưu tập hoặc trình tự phổ biến là

>>> from typing import Tuple
>>> s: Tuple[int, float, str] = (5, 3.14, 'hello')
0,
>>> from typing import Tuple
>>> s: Tuple[int, float, str] = (5, 3.14, 'hello')
1,
>>> from typing import Tuple
>>> s: Tuple[int, float, str] = (5, 3.14, 'hello')
2 và
>>> from typing import Tuple
>>> s: Tuple[int, float, str] = (5, 3.14, 'hello')
3. Tuy nhiên, bạn không thể chú thích các biến bằng các kiểu dựng sẵn này. Thay vào đó, bạn phải sử dụng mô-đun
>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
9

Hãy xem xét một vài ví dụ

________số 8

Ở đây bạn đã tạo một

>>> from typing import Tuple
>>> s: Tuple[int, float, str] = (5, 3.14, 'hello')
0 với một
>>> from typing import Tuple
>>> s: Tuple[int, float, str] = (5, 3.14, 'hello')
6 duy nhất trong đó. Điều này xác định rằng bạn đang tạo một
>>> from typing import Tuple
>>> s: Tuple[int, float, str] = (5, 3.14, 'hello')
0 chuỗi. Nếu bạn biết danh sách sẽ luôn có cùng kích thước, bạn có thể chỉ định loại của từng mục trong danh sách

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']

Bộ dữ liệu gợi ý rất giống nhau

>>> from typing import Tuple
>>> s: Tuple[int, float, str] = (5, 3.14, 'hello')

Từ điển hơi khác một chút ở chỗ bạn nên gợi ý các loại khóa và giá trị là

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
4

Nếu bạn biết một bộ sưu tập sẽ có kích thước thay đổi, bạn có thể sử dụng dấu chấm lửng

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
5

Bây giờ hãy tìm hiểu phải làm gì nếu một mặt hàng thuộc loại

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
8

Gợi ý các giá trị có thể không có

Đôi khi một giá trị cần được khởi tạo là

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
8, nhưng khi nó được đặt sau, bạn muốn nó là một giá trị khác

Đối với điều đó, bạn có thể sử dụng

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
40

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
9

Mặt khác, nếu giá trị không bao giờ có thể là

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
8, bạn nên thêm
>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
42 vào mã của mình

x: int  # a variable named x without initialization
y: float = 1.0  # a float variable, initialized to 1.0
z: bool = False
a: str = 'Hello type hinting'
2

Hãy tìm hiểu cách chú thích các chức năng tiếp theo

Loại chức năng gợi ý

Các hàm gợi ý kiểu tương tự như các biến gợi ý kiểu. Sự khác biệt chính là bạn cũng có thể thêm kiểu trả về vào hàm

Hãy xem một ví dụ

x: int  # a variable named x without initialization
y: float = 1.0  # a float variable, initialized to 1.0
z: bool = False
a: str = 'Hello type hinting'
3

Ví dụ này cho bạn thấy rằng

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
43 nhận hai đối số,
>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
44 và
>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
45, và cả hai phải là số nguyên. Kiểu trả về là
>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
8, mà bạn chỉ định bằng cách sử dụng
>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
47 sau dấu ngoặc đơn kết thúc nhưng trước dấu hai chấm

Giả sử bạn muốn gán hàm

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
43 cho một biến. Bạn có thể chú thích biến dưới dạng
>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
49 như thế này

>>> from typing import Tuple
>>> s: Tuple[int, float, str] = (5, 3.14, 'hello')
1

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
49 lấy danh sách đối số cho hàm. Nó cũng cho phép bạn chỉ định kiểu trả về

Hãy xem thêm một ví dụ nơi bạn chuyển các đối số phức tạp hơn

>>> from typing import List
>>> names: List[str] = ['Mike']
>>> names
['Mike']
0

Đối với ví dụ này, bạn đã tạo

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
51 chấp nhận 3 đối số

  • một
    >>> from typing import List
    >>> names: List[str, str] = ['Mike', 'James']
    52
  • một chuỗi hai mục
    >>> from typing import Tuple
    >>> s: Tuple[int, float, str] = (5, 3.14, 'hello')
    2
  • một tùy chọn
    >>> from typing import List
    >>> names: List[str, str] = ['Mike', 'James']
    54 được mặc định là
    >>> from typing import List
    >>> names: List[str, str] = ['Mike', 'James']
    8

Lưu ý rằng khi bạn sử dụng giá trị mặc định trong một hàm, bạn nên thêm khoảng trắng trước và sau dấu bằng khi sử dụng gợi ý loại

Nó cũng trả về

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
8 hoặc một chuỗi

Hãy tiếp tục và khám phá những việc cần làm trong những tình huống thậm chí còn phức tạp hơn

Phải làm gì khi mọi thứ trở nên phức tạp

Bạn đã biết phải làm gì khi một giá trị có thể là

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
8, nhưng bạn có thể làm gì khác khi mọi thứ trở nên phức tạp?

Đối với trường hợp sử dụng cụ thể đó, bạn có thể sử dụng

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
58

>>> from typing import List
>>> names: List[str] = ['Mike']
>>> names
['Mike']
1

Gợi ý kiểu này có nghĩa là biến,

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
59, có thể là một chuỗi hoặc một số nguyên

Cũng có trường hợp một hàm có thể nhận một đối tượng. Nếu đối tượng đó có thể là một trong nhiều đối tượng khác nhau, thì bạn có thể sử dụng

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
90

>>> from typing import List
>>> names: List[str] = ['Mike']
>>> names
['Mike']
2

Sử dụng

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
90 một cách thận trọng vì bạn thực sự không thể biết bạn đang quay lại cái gì. Vì nó có thể là loại "bất kỳ", nó giống như bắt tất cả các ngoại lệ bằng một
>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
92 trần. Bạn không biết mình đang bắt gặp ngoại lệ nào với điều đó và bạn cũng không biết mình đang ám chỉ loại nào khi sử dụng
>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
90

Các lớp học

Nếu bạn có một

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
94 mà bạn đã viết, bạn cũng có thể tạo chú thích cho nó

>>> from typing import List
>>> names: List[str] = ['Mike']
>>> names
['Mike']
3

Điều này có thể thực sự hữu ích nếu bạn đang chuyển các thể hiện của lớp giữa các hàm hoặc phương thức

người trang trí

Trang trí là một con thú đặc biệt. Chúng là các chức năng nhận các chức năng khác và sửa đổi chúng. Bạn sẽ tìm hiểu về decorator sau này trong cuốn sách này

Thêm gợi ý loại cho người trang trí là điều xấu xí

chúng ta hãy xem

>>> from typing import List
>>> names: List[str] = ['Mike']
>>> names
['Mike']
4

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
95 là một cách để chỉ định loại tùy chỉnh. Bạn đang tạo một loại
>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
49 tùy chỉnh có thể nhận bất kỳ số lượng đối số nào và trả về
>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
90. Sau đó, bạn tạo một trình trang trí và thêm kiểu mới làm gợi ý kiểu cho đối số đầu tiên cũng như kiểu trả về

Hàm

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
98 chỉ được sử dụng bởi Mypy, tiện ích kiểm tra mã tĩnh. Nó được sử dụng để truyền một giá trị cho loại được chỉ định. Trong trường hợp này, bạn đang sử dụng hàm
>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
99 dưới dạng loại
x: int  # a variable named x without initialization
y: float = 1.0  # a float variable, initialized to 1.0
z: bool = False
a: str = 'Hello type hinting'
20

Răng cưa

Bạn có thể tạo một tên mới cho một loại. Ví dụ: hãy đổi tên loại

x: int  # a variable named x without initialization
y: float = 1.0  # a float variable, initialized to 1.0
z: bool = False
a: str = 'Hello type hinting'
21 thành
x: int  # a variable named x without initialization
y: float = 1.0  # a float variable, initialized to 1.0
z: bool = False
a: str = 'Hello type hinting'
22

>>> from typing import List
>>> names: List[str] = ['Mike']
>>> names
['Mike']
5

Bây giờ

x: int  # a variable named x without initialization
y: float = 1.0  # a float variable, initialized to 1.0
z: bool = False
a: str = 'Hello type hinting'
22 và
x: int  # a variable named x without initialization
y: float = 1.0  # a float variable, initialized to 1.0
z: bool = False
a: str = 'Hello type hinting'
21 đề cập đến gợi ý cùng loại. Bí danh gợi ý loại hữu ích cho các loại phức tạp

Tài liệu

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
9 có một ví dụ hay được sao chép bên dưới

>>> from typing import List
>>> names: List[str] = ['Mike']
>>> names
['Mike']
6

Mã này cho phép bạn lồng các loại bên trong các loại khác trong khi vẫn có thể viết gợi ý loại phù hợp

Gợi ý loại khác

Có một số gợi ý loại khác mà bạn cũng có thể sử dụng. Ví dụ: có các loại có thể thay đổi chung như

x: int  # a variable named x without initialization
y: float = 1.0  # a float variable, initialized to 1.0
z: bool = False
a: str = 'Hello type hinting'
26 mà bạn có thể sử dụng cho từ điển có thể thay đổi tùy chỉnh

Ngoài ra còn có loại

x: int  # a variable named x without initialization
y: float = 1.0  # a float variable, initialized to 1.0
z: bool = False
a: str = 'Hello type hinting'
27 mà bạn sẽ sử dụng cho trình quản lý ngữ cảnh

Kiểm tra tài liệu đầy đủ để biết tất cả các chi tiết của tất cả các loại khác nhau

Loại Nhận xét

Trăn 2. 7 phát triển đã kết thúc vào ngày 1 tháng 1 năm 2020. Tuy nhiên, sẽ có nhiều dòng mã Python 2 kế thừa mà mọi người sẽ phải làm việc trong nhiều năm tới. Gợi ý loại chưa bao giờ được thêm vào Python 2. Nhưng bạn có thể sử dụng một cú pháp tương tự như bình luận

Đây là một ví dụ

>>> from typing import List
>>> names: List[str] = ['Mike']
>>> names
['Mike']
7

Để thực hiện công việc này, bạn cần có nhận xét bắt đầu bằng

x: int  # a variable named x without initialization
y: float = 1.0  # a float variable, initialized to 1.0
z: bool = False
a: str = 'Hello type hinting'
28. Dòng này phải nằm trên cùng hoặc sau dòng mã mà nó đang gợi ý. Nếu hàm nhận nhiều đối số, thì bạn sẽ phân tách các gợi ý bằng dấu phẩy

>>> from typing import List
>>> names: List[str] = ['Mike']
>>> names
['Mike']
8

Thay vào đó, một số IDE Python có thể hỗ trợ gợi ý kiểu trong chuỗi tài liệu. PyCharm cho phép bạn làm những việc sau chẳng hạn

>>> from typing import List
>>> names: List[str] = ['Mike']
>>> names
['Mike']
9

Mypy sẽ xử lý các nhận xét khác, nhưng không hoạt động trên các nhận xét này. Nếu bạn đang sử dụng PyCharm, bạn có thể sử dụng một trong hai hình thức gợi ý loại

Nếu công ty bạn muốn sử dụng type hinting, bạn nên chủ trương nâng cấp lên Python 3 để tận dụng tối đa

Kiểm tra loại tĩnh

Bạn đã thấy Mypy được nhắc đến nhiều lần rồi. Bạn có thể đọc hết tất cả về nó ở đây

Nếu bạn muốn chạy Mypy bằng mã của riêng mình, bạn sẽ cần cài đặt nó bằng cách sử dụng

x: int  # a variable named x without initialization
y: float = 1.0  # a float variable, initialized to 1.0
z: bool = False
a: str = 'Hello type hinting'
29

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
0

Khi bạn đã cài đặt

x: int  # a variable named x without initialization
y: float = 1.0  # a float variable, initialized to 1.0
z: bool = False
a: str = 'Hello type hinting'
30, bạn có thể chạy công cụ như thế này

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
1

Mypy sẽ chạy mã của bạn và in ra bất kỳ loại lỗi nào mà nó tìm thấy. Khi Mypy chạy, nó chạy mà không cần chạy mã của bạn. Điều này hoạt động giống như một kẻ nói dối. Kẻ nói dối là một công cụ để kiểm tra tĩnh mã của bạn để tìm lỗi

Nếu không có gợi ý kiểu trong chương trình của bạn, Mypy sẽ không in báo cáo bất kỳ lỗi nào cả

Hãy viết một hàm gợi ý kiểu xấu và lưu nó vào một tệp có tên

x: int  # a variable named x without initialization
y: float = 1.0  # a float variable, initialized to 1.0
z: bool = False
a: str = 'Hello type hinting'
31

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
2

Bây giờ bạn có một số mã, bạn có thể chạy Mypy với nó

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
3

Đầu ra này cho bạn biết rằng có một vấn đề trên dòng 4. Chuỗi không có thuộc tính

x: int  # a variable named x without initialization
y: float = 1.0  # a float variable, initialized to 1.0
z: bool = False
a: str = 'Hello type hinting'
32

Hãy cập nhật mã để xóa các cuộc gọi đến phương thức

x: int  # a variable named x without initialization
y: float = 1.0  # a float variable, initialized to 1.0
z: bool = False
a: str = 'Hello type hinting'
32 không tồn tại. Bạn có thể lưu những thay đổi này vào một tệp mới có tên là
x: int  # a variable named x without initialization
y: float = 1.0  # a float variable, initialized to 1.0
z: bool = False
a: str = 'Hello type hinting'
34

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
4

Bây giờ bạn nên chạy Mypy đối với thay đổi của mình và xem bạn đã sửa nó chưa

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
5

Rất tiếc. Vẫn còn lỗi. Lần này bạn biết rằng bạn không mong đợi hàm này trả về bất kỳ thứ gì. Bạn có thể sửa mã để nó không trả về bất kỳ thứ gì hoặc bạn có thể sửa gợi ý loại để nó trả về

>>> from typing import Tuple
>>> s: Tuple[int, float, str] = (5, 3.14, 'hello')
6

Bạn nên thử làm cái sau và lưu đoạn mã sau vào

x: int  # a variable named x without initialization
y: float = 1.0  # a float variable, initialized to 1.0
z: bool = False
a: str = 'Hello type hinting'
36

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
6

Bây giờ hãy chạy Mypy với tệp mới này

>>> from typing import List
>>> names: List[str, str] = ['Mike', 'James']
7

Lần này mã của bạn không có vấn đề gì

Bạn có thể chạy Mypy trên nhiều tệp hoặc thậm chí toàn bộ thư mục. Nếu bạn chuyên sử dụng gợi ý kiểu trong mã của mình, thì bạn nên chạy Mypy trên mã của mình thường xuyên để đảm bảo mã của bạn không có lỗi

kết thúc

Bây giờ bạn đã biết loại gợi ý hoặc chú thích là gì và cách thực hiện. Trên thực tế, bạn đã học được tất cả những điều cơ bản cần thiết để thực hiện gợi ý nhập một cách hiệu quả

Trong bài viết này, bạn đã tìm hiểu về

  • Ưu và nhược điểm của gợi ý loại
  • Gợi ý loại tích hợp / Chú thích biến
  • Gợi ý loại bộ sưu tập
  • Các giá trị gợi ý có thể là
    >>> from typing import List
    >>> names: List[str, str] = ['Mike', 'James']
    8
  • Loại chức năng gợi ý
  • Phải làm gì khi mọi thứ trở nên phức tạp
  • Các lớp học
  • người trang trí
  • Răng cưa
  • Gợi ý loại khác
  • Loại Nhận xét
  • Kiểm tra loại tĩnh

Nếu bạn gặp khó khăn, bạn nên xem các tài nguyên sau để được trợ giúp

Gõ gợi ý là không cần thiết trong Python. Bạn có thể viết tất cả mã của mình mà không cần thêm bất kỳ chú thích nào vào mã của mình. Nhưng gợi ý gõ là tốt để hiểu và có thể hữu ích trong hộp công cụ của bạn

Phiên bản Python nào hỗ trợ gợi ý loại?

Kể từ phiên bản 3. 5 , Python hỗ trợ gợi ý kiểu. chú thích mã, thông qua công cụ bổ sung, có thể kiểm tra xem bạn có đang sử dụng mã của mình đúng cách hay không.

Python có gợi ý kiểu không?

Với Python 3. 5, gợi ý nhập đã chính thức trở thành một phần của ngôn ngữ (PEP 484). Sử dụng công cụ kiểm tra mã hoặc kẻ nói dối, nhà phát triển có thể kiểm tra tính nhất quán của các biến và loại của chúng trên cơ sở mã và thực hiện các phân tích mã tĩnh mà trước đây khó hoặc không thể thực hiện được.

Khi nào Python thêm gợi ý loại?

Gợi ý loại đã được giới thiệu như một tính năng mới trong Python 3. 5 .

Liệu Python 3. 6 gợi ý loại hỗ trợ?

Bạn có thể thêm gợi ý loại cho tham số hàm/phương thức và loại trả về (Python 3. 5) và các biến được sử dụng trong phép gán (khai báo hiệu quả – Python 3. 6).