Hướng dẫn python type hints best practice - gợi ý loại python thực hành tốt nhất
Trong bài học này, bạn sẽ khám phá những ưu và nhược điểm của gợi ý loại. Trong bài học trước, bạn đã xem qua loại kiểm tra trong Python trông như thế nào. Dưới đây là một số lợi thế của gợi ý loại:type hints. In the previous lesson, you took a peek into what type checking in Python looks like. Here are some of the advantages of type hints: Show
Tất nhiên, kiểm tra loại tĩnh không phải là tất cả các đào và kem. Ngoài ra còn có một số nhược điểm bạn nên xem xét:
Bạn có nên sử dụng kiểm tra loại tĩnh trong mã của riêng bạn không? Nó không phải là một câu hỏi tất cả hoặc không có gì. Python hỗ trợ khái niệm gõ dần dần. Điều này có nghĩa là bạn có thể dần dần đưa các loại vào mã của mình. Mã không có gợi ý loại sẽ bị bỏ qua bởi trình kiểm tra loại tĩnh. Do đó, bạn có thể bắt đầu thêm các loại vào các thành phần quan trọng và tiếp tục miễn là nó thêm giá trị cho bạn. Dưới đây là một vài quy tắc về việc có nên thêm các loại vào dự án của bạn:
Trong bài viết xuất sắc của mình, trạng thái của các gợi ý loại trong Python, Bernátbor đề nghị rằng nên sử dụng gợi ý loại của loại bất cứ khi nào các bài kiểm tra đơn vị đáng để viết. Thật vậy, gõ gợi ý đóng một vai trò tương tự như các bài kiểm tra trong mã của bạn: chúng giúp bạn như một nhà phát triển viết mã tốt hơn. Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn về sự hiểu biết của bạn: Kiểm tra loại Python This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Python Type Checking Có phải thực hành tốt để sử dụng gợi ý loại trong Python? Nhập gợi ý giúp bạn xây dựng và duy trì kiến trúc sạch hơn. Hành động viết gợi ý loại buộc bạn phải suy nghĩ về các loại trong chương trình của bạn. Mặc dù bản chất năng động của Python là một trong những tài sản tuyệt vời của nó, có ý thức về việc dựa vào việc gõ vịt, các phương pháp quá tải hoặc nhiều loại trả lại là một điều tốt.
Nhập chú thích và loại gợi ý Thêm các loại tĩnh vào mã, cả mã của bạn và mã của những người khácChạy một trình kiểm tra loại tĩnh Thực thi các loại trong thời gian chạyĐây là một hướng dẫn toàn diện sẽ bao gồm rất nhiều mặt đất. Nếu bạn muốn có một cái nhìn nhanh chóng về cách các gợi ý loại hoạt động trong Python và xem liệu kiểm tra loại có phải là thứ bạn sẽ đưa vào mã của mình hay không, bạn không cần phải đọc tất cả. Hai phần Xin chào các loại và ưu và nhược điểm sẽ cung cấp cho bạn cách kiểm tra loại hoạt động và đề xuất về khi nó sẽ hữu ích. >>>
Trong ví dụ đầu tiên, chi nhánh 00 không bao giờ chạy để nó không bao giờ được kiểm tra. Ví dụ thứ hai cho thấy rằng khi 00 được đánh giá, nó sẽ tăng 02 vì bạn có thể thêm một số nguyên và một chuỗi trong Python.Tiếp theo, hãy để xem xem các biến có thể thay đổi loại không: >>>
03 Trả về loại đối tượng. Các ví dụ này xác nhận rằng loại 04 được phép thay đổi và Python chính xác thông tin loại khi nó thay đổi.Gõ tĩnhĐối diện của gõ động là gõ tĩnh. Kiểm tra loại tĩnh được thực hiện mà không cần chạy chương trình. Ví dụ, trong hầu hết các ngôn ngữ được gõ tĩnh C và Java, điều này được thực hiện khi chương trình của bạn được biên dịch. Với việc gõ tĩnh, các biến thường không được phép thay đổi các loại, mặc dù các cơ chế để tạo ra một biến thành một loại khác có thể tồn tại. Hãy cùng nhìn vào một ví dụ nhanh chóng từ một ngôn ngữ được gõ tĩnh. Hãy xem xét đoạn trích Java sau:
Dòng đầu tiên tuyên bố rằng tên biến 04 được liên kết với loại 06 tại thời điểm biên dịch. Tên không bao giờ có thể được bật lại cho một loại khác. Trong dòng thứ hai, 04 được gán một giá trị. Nó không bao giờ có thể được gán một giá trị không phải là đối tượng 06. Chẳng hạn, nếu sau này bạn nói 09, trình biên dịch sẽ gây ra lỗi vì các loại không tương thích.Python sẽ luôn luôn là một ngôn ngữ được đánh máy động. Tuy nhiên, PEP 484 đã giới thiệu các gợi ý loại, điều này cũng có thể thực hiện kiểm tra loại tĩnh của mã python. Không giống như cách các loại hoạt động trong hầu hết các ngôn ngữ được gõ tĩnh khác, bản thân các gợi ý của chúng tôi đã khiến Python thực thi các loại. Như tên nói, loại gợi ý chỉ đề xuất các loại. Có các công cụ khác, mà bạn sẽ thấy sau đó, thực hiện kiểm tra loại tĩnh bằng cách sử dụng gợi ý loại. Gõ vịtMột thuật ngữ khác thường được sử dụng khi nói về Python là đánh máy vịt. Moniker này xuất phát từ cụm từ, nếu nó đi như một con vịt và nó bị xáo trộn như một con vịt, thì nó phải là một con vịt (hoặc bất kỳ biến thể nào của nó). Gõ vịt là một khái niệm liên quan đến gõ động, trong đó loại hoặc lớp của một đối tượng ít quan trọng hơn các phương pháp mà nó định nghĩa. Sử dụng gõ vịt, bạn không kiểm tra các loại. Thay vào đó, bạn kiểm tra sự hiện diện của một phương thức hoặc thuộc tính nhất định. Ví dụ, bạn có thể gọi 10 trên bất kỳ đối tượng Python nào xác định phương thức 11:>>>
Lưu ý rằng cuộc gọi đến 10 cung cấp giá trị trả về của phương thức 11. Trên thực tế, việc thực hiện 10 về cơ bản tương đương với các điều sau:
Để gọi 15, ràng buộc thực sự duy nhất trên 16 là nó phải xác định phương thức 11. Mặt khác, đối tượng có thể có các loại khác nhau như 18, 19, 20 hoặc 21.Gõ vịt có phần được hỗ trợ khi kiểm tra loại tĩnh của mã python, sử dụng phân nhóm cấu trúc. Bạn sẽ tìm hiểu thêm về việc đánh máy vịt sau. Các loại xin chàoTrong phần này, bạn sẽ thấy cách thêm gợi ý loại vào một hàm. Hàm sau đây biến một chuỗi văn bản thành một tiêu đề bằng cách thêm vốn hóa thích hợp và một dòng trang trí:
Theo mặc định, hàm trả về tiêu đề bên trái được căn chỉnh với một gạch chân. Bằng cách đặt cờ 22 thành 23, bạn có thể có tiêu đề được tập trung với một dòng xung quanh là 24:>>>
Đó là thời gian cho gợi ý loại đầu tiên của chúng tôi! Để thêm thông tin về các loại vào hàm, bạn chỉ cần chú thích các đối số của nó và trả về giá trị như sau:
Cú pháp 25 nói rằng đối số 26 phải thuộc loại 18. Tương tự, đối số 22 tùy chọn phải có loại 29 với giá trị mặc định 30. Cuối cùng, ký hiệu 31 chỉ định rằng 32 sẽ trả về một chuỗi.Về phong cách, PEP 8 khuyến nghị như sau:
Thêm các gợi ý loại như thế này không có hiệu ứng thời gian chạy: chúng chỉ là gợi ý và không được thực thi. Chẳng hạn, nếu chúng ta sử dụng một loại sai cho đối số (thừa nhận được đặt tên xấu) 22, mã vẫn chạy mà không có bất kỳ vấn đề hoặc cảnh báo nào:>>>
Để bắt loại lỗi này, bạn có thể sử dụng trình kiểm tra loại tĩnh. Đó là, một công cụ kiểm tra các loại mã của bạn mà không thực sự chạy nó theo nghĩa truyền thống. Bạn có thể đã có một trình kiểm tra loại như vậy được tích hợp trong trình soạn thảo của bạn. Ví dụ, Pycharm ngay lập tức đưa ra cảnh báo cho bạn: Công cụ phổ biến nhất để kiểm tra loại là mypy mặc dù. Bạn sẽ nhận được một giới thiệu ngắn về MyPy trong giây lát, trong khi bạn có thể tìm hiểu thêm về cách thức hoạt động sau này. Nếu bạn không có MyPy trên hệ thống của mình, bạn có thể cài đặt nó bằng 39:Đặt mã sau vào một tệp có tên 40:
Đây thực chất là cùng một mã bạn đã thấy trước đó: định nghĩa của 32 và hai ví dụ đang sử dụng nó.Bây giờ hãy chạy MyPy trên mã này: 0Dựa trên các gợi ý loại, MyPy có thể cho chúng tôi biết rằng chúng tôi đang sử dụng sai loại trên dòng 10. Để khắc phục sự cố trong mã, bạn nên thay đổi giá trị của đối số 22 mà bạn đang truyền. Bạn cũng có thể đổi tên cờ 22 thành một cái gì đó ít khó hiểu hơn: 1Tại đây, bạn đã thay đổi 22 thành 45 và sử dụng chính xác giá trị boolean cho 45 khi gọi 32. Mã hiện vượt qua MyPy: 2Thông báo thành công xác nhận không có lỗi loại được phát hiện. Các phiên bản cũ hơn của MyPy được sử dụng để chỉ ra điều này bằng cách hiển thị không có đầu ra nào cả. Hơn nữa, khi bạn chạy mã, bạn sẽ thấy đầu ra dự kiến: 3Tiêu đề đầu tiên được căn chỉnh bên trái, trong khi cái thứ hai được tập trung. Ưu và nhược điểmPhần trước đã cho bạn một chút hương vị về loại kiểm tra trong Python trông như thế nào. Bạn cũng đã thấy một ví dụ về một trong những lợi thế của việc thêm các loại vào mã của bạn: Nhập gợi ý giúp bắt một số lỗi nhất định. Những lợi thế khác bao gồm:catch certain errors. Other advantages include:
Tất nhiên, kiểm tra loại tĩnh không phải là tất cả các đào và kem. Ngoài ra còn có một số nhược điểm bạn nên xem xét:
Sau đó, bạn sẽ tìm hiểu về mô -đun 6 và cách nó cần thiết trong hầu hết các trường hợp khi bạn thêm gợi ý loại. Nhập các mô -đun nhất thiết phải mất một thời gian, nhưng bao nhiêu?Để có được một số ý tưởng về điều này, hãy tạo hai tệp: 51 phải là một tệp trống, trong khi 52 nên chứa dòng sau:Trên Linux, nó khá dễ dàng để kiểm tra thời gian nhập khẩu 6 sử dụng tiện ích 54: 4Vì vậy, chạy tập lệnh 55 mất khoảng 45 mili giây. Tất nhiên đây không phải là tất cả thời gian dành cho việc nhập 6. Một số trong số này là chi phí trong việc bắt đầu trình thông dịch Python, vì vậy hãy để so sánh với việc chạy Python trên một tệp trống: 5Dựa trên thử nghiệm này, việc nhập mô -đun 6 mất khoảng 17 mili giây trên Python 3.6.Một trong những cải tiến được quảng cáo trong Python 3.7 là khởi động nhanh hơn. Hãy để xem nếu kết quả khác nhau: 6Thật vậy, thời gian khởi động chung giảm khoảng 8 mili giây và thời gian nhập 6 giảm từ 17 xuống còn khoảng 6 mili giây nhanh hơn 3 lần.Sử dụng Có các công cụ tương tự trên các nền tảng khác. Bản thân Python đi kèm với mô -đun 59 trong thư viện tiêu chuẩn. Thông thường, chúng tôi sẽ trực tiếp sử dụng 59 cho các thời gian trên. Tuy nhiên, 59 đấu tranh để nhập khẩu thời gian một cách đáng tin cậy vì Python chỉ thông minh về việc nhập các mô -đun một lần. Xem xét ví dụ sau: 7Mặc dù bạn nhận được kết quả, bạn nên nghi ngờ về kết quả: 0,1 micro giây nhanh hơn 100000 lần so với số lượng 54 được đo! Những gì 59 thực sự đã thực hiện là chạy tuyên bố 65 30 triệu lần, với Python thực sự chỉ nhập 6 một lần.Để có được kết quả hợp lý, bạn có thể nói 59 chỉ chạy một lần: 8Những kết quả này ở cùng quy mô với kết quả từ 54 ở trên. Tuy nhiên, vì những điều này chỉ dựa trên một lần thực thi mã, nên chúng không đáng tin cậy như những người dựa trên nhiều lần chạy.Kết luận trong cả hai trường hợp này là nhập khẩu 6 mất vài mili giây. Đối với phần lớn các chương trình và tập lệnh bạn viết, điều này có thể sẽ không phải là một vấn đề.Tùy chọn Trong Python 3.7, cũng có một tùy chọn dòng lệnh mới có thể được sử dụng để tìm ra số thời gian nhập khẩu. Sử dụng 71, bạn sẽ nhận được một báo cáo về tất cả các nhập khẩu được thực hiện: 9Điều này cho thấy một kết quả tương tự. Nhập khẩu 6 mất khoảng 6 mili giây. Nếu bạn đọc kỹ báo cáo, bạn có thể nhận thấy rằng khoảng một nửa thời gian này được dành cho việc nhập các mô -đun 73 và 74 mà 6 phụ thuộc vào.Vì vậy, bạn nên sử dụng kiểm tra loại tĩnh trong mã của riêng bạn? Chà, nó không phải là một câu hỏi tất cả hoặc không có gì. May mắn thay, Python hỗ trợ khái niệm gõ dần dần. Điều này có nghĩa là bạn có thể dần dần đưa các loại vào mã của mình. Mã không có gợi ý loại sẽ bị bỏ qua bởi trình kiểm tra loại tĩnh. Do đó, bạn có thể bắt đầu thêm các loại vào các thành phần quan trọng và tiếp tục miễn là nó thêm giá trị cho bạn. Nhìn vào các danh sách trên của ưu và nhược điểm mà bạn sẽ nhận thấy rằng việc thêm các loại sẽ không có tác dụng đối với chương trình đang chạy của bạn hoặc người dùng chương trình của bạn. Kiểm tra loại có nghĩa là làm cho cuộc sống của bạn như một nhà phát triển tốt hơn và thuận tiện hơn. Một vài quy tắc về việc có nên thêm các loại vào dự án của bạn là:
Trong bài viết xuất sắc của mình, trạng thái của các gợi ý loại trong Python Bernátbor khuyến nghị rằng nên sử dụng gợi ý loại của loại bất cứ khi nào các bài kiểm tra đơn vị đáng để viết. Thật vậy, gõ gợi ý đóng một vai trò tương tự như các bài kiểm tra trong mã của bạn: chúng giúp bạn như một nhà phát triển viết mã tốt hơn.type hints should be used whenever unit tests are worth writing.” Indeed, type hints play a similar role as tests in your code: they help you as a developer write better code. Hy vọng bây giờ bạn có một ý tưởng về cách kiểm tra loại hoạt động trong Python và liệu nó có phải là thứ gì đó bạn muốn sử dụng trong các dự án của riêng bạn hay không. Trong phần còn lại của hướng dẫn này, chúng tôi sẽ đi sâu vào chi tiết hơn về hệ thống loại Python, bao gồm cả cách bạn chạy Trình kiểm tra loại tĩnh (đặc biệt tập trung vào MyPy), cách bạn nhập mã kiểm tra sử dụng thư viện mà không có gợi ý loại và cách bạn Sử dụng chú thích trong thời gian chạy. Chú thíchCác chú thích được giới thiệu trong Python 3.0, ban đầu không có mục đích cụ thể nào. Chúng chỉ đơn giản là một cách để liên kết các biểu thức tùy ý với các đối số chức năng và trả về các giá trị. Nhiều năm sau, PEP 484 đã xác định cách thêm gợi ý loại vào mã Python của bạn, dựa trên công việc mà Jukka Lehtosalo đã thực hiện trên bằng tiến sĩ của mình. Dự án kiểu mẫu. Cách chính để thêm gợi ý loại là sử dụng chú thích. Vì kiểm tra loại ngày càng trở nên phổ biến hơn, điều này cũng có nghĩa là các chú thích chủ yếu nên được dành riêng cho các gợi ý loại. Các phần tiếp theo giải thích cách các chú thích hoạt động trong bối cảnh gợi ý loại. Chú thích chức năngĐối với các chức năng, bạn có thể chú thích các đối số và giá trị trả về. Điều này được thực hiện như sau: 0Đối với các đối số, cú pháp là 78, trong khi loại trả về được chú thích bằng 79. Lưu ý rằng chú thích phải là biểu thức Python hợp lệ.Ví dụ đơn giản sau đây thêm các chú thích vào một hàm tính toán chu vi của một vòng tròn: 1Khi chạy mã, bạn cũng có thể kiểm tra các chú thích. Chúng được lưu trữ trong một thuộc tính 80 đặc biệt trên hàm:>>> 2Đôi khi bạn có thể bị nhầm lẫn bởi cách MyPy đang diễn giải gợi ý loại của bạn. Đối với những trường hợp đó, có các biểu thức MyPy đặc biệt: 81 và 82. Bạn có thể thêm những thứ này vào mã của mình trước khi chạy MyPy và MyPy sẽ báo cáo một cách nghiêm túc những loại đã suy ra. Ví dụ, lưu mã sau vào 83: 3Tiếp theo, chạy mã này qua MyPy: 4Ngay cả khi không có bất kỳ chú thích nào, MyPy đã suy ra chính xác các loại của 84 tích hợp, cũng như các biến cục bộ của chúng tôi 85 và 86.Nếu MyPy nói rằng tên của 87 ‘không được xác định, bạn có thể cần cập nhật cài đặt MyPy của mình. Biểu thức 82 có sẵn trong phiên bản MyPy 0.610 trở lên.Chú thích biếnTrong định nghĩa của 89 trong phần trước, bạn chỉ chú thích các đối số và giá trị trả về. Bạn đã không thêm bất kỳ chú thích nào bên trong cơ thể chức năng. Thường xuyên hơn không, điều này là đủ.Tuy nhiên, đôi khi trình kiểm tra loại cũng cần trợ giúp trong việc tìm ra các loại biến. Các chú thích thay đổi được xác định trong PEP 526 và được giới thiệu trong Python 3.6. Cú pháp giống như đối với các chú thích đối số chức năng: 5Biến 90 đã được chú thích bằng gợi ý loại 91.Chú thích của các biến được lưu trữ trong từ điển cấp độ mô -đun 92:>>> 6Bạn đã cho phép chú thích một biến mà không cho nó một giá trị. Điều này thêm chú thích cho từ điển 92, trong khi biến vẫn chưa được xác định:>>> 7Bạn đã cho phép chú thích một biến mà không cho nó một giá trị. Điều này thêm chú thích cho từ điển 92, trong khi biến vẫn chưa được xác định:Vì không có giá trị nào được gán cho >>> thing = "Hello"
>>> type(thing)
|