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.51,
# script.pyx: int = 2# ...x = 3.50,
# script.pyx: int = 2# ...x = 3.51,
# script.pyx: int = 2# ...x = 3.52,
# script.pyx: int = 2# ...x = 3.53,
# script.pyx: int = 2# ...x = 3.54,
# script.pyx: int = 2# ...x = 3.55,
# script.pyx: int = 2# ...x = 3.56,
# script.pyx: int = 2# ...x = 3.57,
# script.pyx: int = 2# ...x = 3.58,
# script.pyx: int = 2# ...x = 3.59
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.510
Trong ví dụ sau,
# script.pyx: int = 2# ...x = 3.511 ,
# script.pyx: int = 2# ...x = 3.512 ,
# script.pyx: int = 2# ...x = 3.513 ,
# script.pyx: int = 2# ...x = 3.514 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.59
👉 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.
Để 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.516 với kiểu
# script.pyx: int = 2# ...x = 3.51 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.518
Sau đó, để phân tích mã của bạn, chỉ cần chạy.
# script.pyx: int = 2# ...x = 3.519
Ả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ạiTạ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
- 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
- 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
- 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áchGiả 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.54 với loại
# script.pyx: int = 2# ...x = 3.50
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.54 tiêu chuẩn tích hợp sẵn bằng loại
# script.pyx: int = 2# ...x = 3.543 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 —DictTô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.51
Để 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.546 — Liên minh
Bắt đầu từ Python 3. 10,
# script.pyx: int = 2# ...x = 3.544 được thay thế bằng# script.pyx: int = 2# ...x = 3.545 có nghĩa là giờ đây# script.pyx: int = 2# ...x = 3.546 tương đương với# script.pyx: int = 2# ...x = 3.547
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.548 ] 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.52
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.53
Đâ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.549 khá đơn giản. Thực ra viết cái này
# script.pyx: int = 2# ...x = 3.55
tương đương với việc viết này
# script.pyx: int = 2# ...x = 3.56
Loại
# script.pyx: int = 2# ...x = 3.549 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.521 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ọnNế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ỗiMộ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 — TupleLoạ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.55
# script.pyx: int = 2# ...x = 3.50
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ậnNhậ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