Loại Python gợi ý phiên bản tối thiểu

Gợi ý kiểu, còn được gọi là chú thích kiểu, hoàn toàn không bắt buộc trong Python. Tuy nhiên, có một số lợi ích của việc sử dụng chúng trong mã của bạn

Trong bài viết này, tôi sẽ cố gắng giải thích type hinting trong Python là gì và tại sao bạn nên sử dụng chúng. Để củng cố sự hiểu biết của bạn, tôi sẽ cung cấp các ví dụ dễ làm theo cùng với…

Python là một ngôn ngữ lập trình kiểu động. Điều này có nghĩa là trình thông dịch chỉ thực hiện kiểm tra kiểu khi mã chạy và kiểu biến được phép thay đổi trong suốt thời gian tồn tại của nó

Mặc dù Python luôn duy trì kiểu gõ động và không bao giờ có ý định thay đổi hướng này, các gợi ý kiểu đã được giới thiệu kể từ PEP 484 với mục tiêu đưa kiểm tra kiểu tĩnh vào phân tích mã

Trong bài viết này, chúng tôi sẽ giới thiệu các gợi ý về loại và xem qua 12 khái niệm mà bạn nên làm quen khi sử dụng chúng

Ở cuối bài đăng này, bạn sẽ có một cái nhìn tổng quan về các gợi ý loại, chúng là gì và khi nào bạn nên sử dụng chúng. Bạn cũng sẽ học cách xây dựng các kiểu phức tạp và thực hiện kiểm tra kiểu tĩnh

Như đã nói, chúng ta hãy đi sâu vào và xem một số mã 💻

Tham gia Medium với liên kết giới thiệu của tôi - Ahmed Besbes

Đọc mọi câu chuyện của Ahmed Besbes [và hàng nghìn nhà văn khác trên Medium]. Phí thành viên của bạn hỗ trợ trực tiếp…

vừa phải. com

1— Nhập chú thích. một cú pháp mới để hỗ trợ thêm các loại

Gợi ý loại được thực hiện bằng chú thích Python [được giới thiệu từ PEP 3107]. Chúng được sử dụng để thêm kiểu cho biến, tham số, đối số hàm cũng như giá trị trả về, thuộc tính lớp và phương thức của chúng.

Thêm gợi ý loại không có hiệu ứng thời gian chạy. đây chỉ là những gợi ý và không được thực thi trên chính chúng. Nếu bạn lo lắng về chúng, hãy nhớ rằng phiên dịch viên luôn phớt lờ chúng

👉 Chú thích biến
Chú thích biến theo cú pháp này.

:  = 

Bạn có thể thực hiện gợi ý loại với một trong các loại tích hợp cơ bản sau.

# script.pyx: int = 2# ...x = 3.5
1,
# script.pyx: int = 2# ...x = 3.5
0,
# script.pyx: int = 2# ...x = 3.5
1,
# script.pyx: int = 2# ...x = 3.5
2,
# script.pyx: int = 2# ...x = 3.5
3,
# script.pyx: int = 2# ...x = 3.5
4,
# script.pyx: int = 2# ...x = 3.5
5,
# script.pyx: int = 2# ...x = 3.5
6,
# script.pyx: int = 2# ...x = 3.5
7,
# script.pyx: int = 2# ...x = 3.5
8,
# script.pyx: int = 2# ...x = 3.5
9

Dưới đây là một số ví dụ để bắt đầu

Để xây dựng các loại nâng cao hơn, chúng tôi sẽ sử dụng mô-đun đánh máy. Tiếp tục đọc sách để học hỏi nhiều hơn

👉 Chú thích hàm
Bạn cũng có thể thêm gợi ý loại cho các hàm để chỉ định loại đối số và giá trị trả về của chúng.

Chỉ định các loại đối số được thực hiện bằng cú pháp trước đó

Nhập gợi ý giá trị trả về được thực hiện bằng mũi tên

# script.pyx: int = 2# ...x = 3.5
10

Trong ví dụ sau,

# script.pyx: int = 2# ...x = 3.5
11 ,
# script.pyx: int = 2# ...x = 3.5
12 ,
# script.pyx: int = 2# ...x = 3.5
13 ,
# script.pyx: int = 2# ...x = 3.5
14 phải là các biểu thức python hợp lệ, chẳng hạn như các loại tích hợp hoặc phức tạp hơn bằng cách sử dụng mô-đun gõ

→ Nếu ​​một hàm không trả về bất cứ thứ gì, bạn có thể đặt kiểu trả về [sau mũi tên] thành

# script.pyx: int = 2# ...x = 3.5
9

👉 Chú thích lớp
Bạn thậm chí có thể chú thích các thuộc tính và phương thức bên trong lớp của mình.

2 — Thực hiện kiểm tra kiểu tĩnh với mypy

Để kiểm tra xem python có thực thi các gợi ý kiểu hay không, hãy thử chạy đoạn script sau khai báo một biến

# script.pyx: int = 2# ...x = 3.5
16 với kiểu
# script.pyx: int = 2# ...x = 3.5
1 và sau đó thay đổi giá trị của nó để lưu trữ một số float

# script.pyx: int = 2# ...x = 3.5

Ảnh chụp màn hình của tác giả

Không có lỗi. [như mong đợi]

Bây giờ nếu bạn thực sự nghiêm túc về mã của mình và vẫn muốn phát hiện các loại lỗi này, bạn có thể sử dụng mypy, một công cụ để thực hiện kiểm tra kiểu tĩnh

Để cài đặt nó, chỉ cần chạy

# script.pyx: int = 2# ...x = 3.5
18

Sau đó, để phân tích mã của bạn, chỉ cần chạy.

# script.pyx: int = 2# ...x = 3.5
19

Ảnh chụp màn hình của tác giả

Trong ví dụ đơn giản này, mypy phát hiện lỗi. Các loại không tương thích trong một bài tập, đó chính xác là những gì chúng tôi muốn làm nổi bật

Bằng cách phân tích tĩnh mã của bạn, mypy giúp bạn tuân thủ các loại bạn đã xác định, cải thiện chất lượng mã của bạn, ngăn các lỗi thầm lặng và chuẩn hóa mã của bạn bằng cách làm theo các phương pháp hay nhất

Để tìm hiểu thêm, hãy kiểm tra http. //mypy-lang. tổ chức/

3— Lợi ích của việc thêm gợi ý loại

Tại sao phải viết gợi ý loại nếu chúng không được trình thông dịch thực thi?

tôi nghe điều đó rất nhiều

Đúng là gợi ý kiểu không thay đổi cách chạy mã của bạn. Bản chất Python được gõ động và không có ý định thay đổi sớm

Tuy nhiên, từ quan điểm trải nghiệm của nhà phát triển, các gợi ý nhập mang lại nhiều lợi ích cho cơ sở mã của bạn

Tôi có thể nghĩ ra những lợi thế sau

  1. Sử dụng gợi ý kiểu, đặc biệt là trong các hàm, ghi lại mã của bạn bằng cách cung cấp chữ ký cung cấp thông tin làm rõ các giả định về kiểu đối số và kiểu kết quả được tạo ra
  2. Việc thông báo các loại sẽ loại bỏ chi phí nhận thức và làm cho mã dễ đọc và gỡ lỗi hơn. Với các loại đầu vào và đầu ra, bạn có thể dễ dàng suy luận về các đối tượng của mình và cách chúng có thể được ghép nối
  3. Gợi ý nhập cải thiện trải nghiệm chỉnh sửa mã của bạn.
    Cùng với mypy, IDE của bạn dựa vào chúng để phân tích tĩnh mã của bạn và giúp phát hiện các lỗi tiềm ẩn [e. g. chuyển một đối số sai loại, gọi một phương thức sai, v.v. ]
    Ngoài ra, tính năng tự động hoàn thành được cung cấp cho từng biến tùy thuộc vào gợi ý loại của nó.

mypy phát hiện các hoạt động của loại được hỗ trợ và các loại không tương thích dựa trên các gợi ý về loại — Ảnh chụp màn hình của tác giả

VSCode sử dụng thông tin gợi ý loại để cung cấp tính năng tự động hoàn thành có liên quan — Ảnh chụp màn hình của tác giả

Trong các phần tiếp theo, chúng tôi sẽ đề cập đến các loại nâng cao từ mô-đun đánh máy

4—Danh sách

Giả sử bạn muốn truyền cho hàm của mình một đối số hơi phức tạp bao gồm… một danh sách các số float. Làm thế nào bạn sẽ chú thích nó?

Bạn có thể thử viết một cái gì đó như thế này bằng cách soạn loại

# script.pyx: int = 2# ...x = 3.5
4 với loại
# script.pyx: int = 2# ...x = 3.5
0

Cố lên

Đáng buồn thay, điều này không hoạt động mặc dù nó có vẻ tự nhiên và trực quan để viết

Để hỗ trợ điều này, bạn chỉ cần thay thế loại

# script.pyx: int = 2# ...x = 3.5
4 tiêu chuẩn tích hợp sẵn bằng loại
# script.pyx: int = 2# ...x = 3.5
43 mà bạn nhập từ mô-đun đánh máy

Điều thú vị về loại Danh sách là nó có thể chứa bất kỳ loại nào bên trong nó, không chỉ loại tích hợp sẵn. Các loại riêng của chúng tôi về cơ bản có thể được kết hợp với Danh sách

Vì vậy, nếu bạn có, chẳng hạn, một danh sách gồm các chuỗi, đây là cách bạn nhập danh sách đó

5 —Dict

Tôi thích sử dụng từ điển python vì chúng linh hoạt. Chúng cho phép bạn sử dụng các khóa và giá trị thuộc các loại khác nhau. Ví dụ: bạn có thể có một từ điển với các khóa chuỗi và giá trị chính tả [trong trường hợp này, biểu thị cấu trúc chính tả lồng nhau]

Tuy nhiên, như một cái giá cho sự linh hoạt này, không phải lúc nào lược đồ cơ bản cũng rõ ràng. loại khóa từ điển là gì?

Để kiểm soát các loại khóa và giá trị trong từ điển của bạn, bạn có thể sử dụng loại Dict từ mô-đun gõ

Giả sử rằng tôi xử lý từ điển bằng khóa chuỗi và giá trị chuỗi

# script.pyx: int = 2# ...x = 3.5
1

Để lập mô hình cấu trúc từ điển như vậy, bạn có thể chuyển hai đối số cho Dict trong đó đối số đầu tiên là loại khóa và đối số thứ hai là loại giá trị

# script.pyx: int = 2# ...x = 3.5
46 — Liên minh

Bắt đầu từ Python 3. 10,

# script.pyx: int = 2# ...x = 3.5
44 được thay thế bằng
# script.pyx: int = 2# ...x = 3.5
45 có nghĩa là giờ đây
# script.pyx: int = 2# ...x = 3.5
46 tương đương với
# script.pyx: int = 2# ...x = 3.5
47

Hợp [X, Y] [hoặc X. Y] có nghĩa là X hoặc Y

Ví dụ 👇

Giả sử chức năng của bạn cần đọc một tệp từ thư mục bộ đệm và tải mô hình đèn pin. Vị trí thư mục bộ đệm này có thể là một giá trị chuỗi [chẳng hạn như

# script.pyx: int = 2# ...x = 3.5
48 ] hoặc một đối tượng Đường dẫn từ thư viện Pathlib

Trong trường hợp đó, mã sẽ như sau

7 —TypedDict

Điều gì sẽ xảy ra nếu từ điển Python của bạn có một lược đồ cố định với các khóa và giá trị chuỗi đã biết thuộc các loại khác nhau?

Một cái gì đó như thế này

# script.pyx: int = 2# ...x = 3.5
2

Làm thế nào bạn sẽ gõ nó?

❌ Sử dụng Dict với Union không lý tưởng vì chúng tôi mất thông tin về khóa nào cần có giá trị thuộc loại nào

✅ Sử dụng TypedDict cho phép bạn khai báo một loại từ điển yêu cầu tất cả các phiên bản của nó có một bộ khóa nhất định, trong đó mỗi khóa được liên kết với một giá trị của một loại nhất quán

Đây là một ví dụ về cách thức hoạt động của nó 👇

Hình ảnh của tác giả — được thực hiện trên https. //carbon. bây giờ. sh/8 — Có thể gọi được

Có thể gọi được là những gì bạn sử dụng khi bạn muốn sử dụng một hàm làm đối số

Bạn cũng có thể chỉ định loại tham số và giá trị trả về của hàm có thể gọi được cú pháp này

# script.pyx: int = 2# ...x = 3.5
3

Đây là ví dụ tương tự với gợi ý loại bổ sung

9 — Bất kỳ

Loại

# script.pyx: int = 2# ...x = 3.5
49 khá đơn giản. Thực ra viết cái này

# script.pyx: int = 2# ...x = 3.5
5

tương đương với việc viết này

# script.pyx: int = 2# ...x = 3.5
6

Loại

# script.pyx: int = 2# ...x = 3.5
49 chỉ ở đây để tuyên bố rõ ràng rằng hàm bar nhằm nhận bất kỳ loại đầu vào nào làm đối số. [có thể vì những gì chức năng này thực hiện sau đó không phụ thuộc vào loại đối số của nó]

Loại

# script.pyx: int = 2# ...x = 3.5
21 này có hữu ích không?

Thành thật mà nói, tôi không biết

10 — Tùy chọn

Nếu bất kỳ chức năng nào của bạn sử dụng một đối số là tùy chọn bởi vì, chẳng hạn, nó có giá trị mặc định, thì bạn có thể sử dụng loại Tùy chọn từ mô-đun nhập liệu

11 — Chuỗi

Một đối tượng kiểu Sequence là bất cứ thứ gì có thể lập chỉ mục. một danh sách, một bộ, một chuỗi, một danh sách các đối tượng, một bộ danh sách các bộ, v.v.

⚠️ Xin lưu ý rằng bộ hoặc từ điển không phải là loại Trình tự

12 — Tuple

Loại Tuple hoạt động hơi khác một chút so với loại Danh sách

Nếu bạn không quan tâm đến các loại của từng phần tử trong bộ dữ liệu của mình, bạn có thể tiếp tục sử dụng loại tích hợp sẵn

# script.pyx: int = 2# ...x = 3.5
5

# script.pyx: int = 2# ...x = 3.5
0

Tuy nhiên, nếu bạn muốn chỉ định loại của mọi phần tử trong loại, hãy sử dụng Tuple

Sự kết luận

Nhập gợi ý mang lại một lớp trừu tượng bổ sung trên mã của bạn. họ giúp ghi lại nó, làm rõ các giả định về đầu vào/đầu ra và ngăn ngừa những sai lầm ngấm ngầm và thầm lặng khi phân tích mã tĩnh [👋 mypy] được thực hiện trên đầu trang

Bây giờ câu hỏi còn lại là. tôi có nên bắt đầu sử dụng gợi ý loại trong các dự án của mình không?

Nếu bạn đang cộng tác trên một cơ sở mã lớn nơi các gợi ý loại [và kiểm tra đơn vị] đã được triển khai, thì việc thêm
Nếu bạn muốn viết mã python hiện đại và .

Tuy nhiên, có lẽ bạn nên tránh thêm gợi ý loại nếu bạn sử dụng phiên bản Python cũ, nếu bạn chưa quen với ngôn ngữ lập trình hoặc nếu hiệu suất là một vấn đề thực sự. Trên thực tế, liên quan đến điểm cuối cùng này, các gợi ý nhập đưa ra một chi phí nhỏ trong thời gian khởi động

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].

Gợi ý kiểu được thêm vào Python khi nào?

Gợi ý loại lần đầu tiên được chỉ định trong PEP 484, như tôi đã đề cập trong video trước và lần đầu tiên chúng được đưa vào Python trong phiên bản 3. 5. 00. 33 Vì vậy, hãy để tôi cho bạn thấy nó trông như thế nào bằng cách cho bạn xem một ví dụ về việc thêm thông tin loại vào một hàm.

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

Gợi ý kiểu Python cung cấp cho bạn kiểu gõ tĩnh tùy chọn để tận dụng tốt nhất cả kiểu gõ tĩnh và động. Bên cạnh loại str, bạn có thể sử dụng các loại dựng sẵn khác như int , float , bool và bytes cho gợi ý loại. Để kiểm tra cú pháp gợi ý kiểu, bạn cần sử dụng công cụ kiểm tra kiểu tĩnh

Gợi ý loại Python có cải thiện hiệu suất không?

Nếu bạn muốn viết mã python hiện đại và tăng chất lượng mã của mình, hãy nhập gợi ý. Tuy nhiên, có lẽ bạn nên tránh thêm gợi ý loại nếu bạn sử dụng phiên bản Python cũ, nếu bạn chưa quen với ngôn ngữ lập trình hoặc nếu hiệu suất là một vấn đề thực sự.

Chủ Đề