Trong hướng dẫn này, bạn sẽ tìm hiểu về kiểm tra kiểu Python. Theo truyền thống, các kiểu đã được xử lý bởi trình thông dịch Python một cách linh hoạt nhưng ngầm định. Các phiên bản Python gần đây cho phép bạn chỉ định các gợi ý loại rõ ràng mà các công cụ khác nhau có thể sử dụng để giúp bạn phát triển mã của mình hiệu quả hơn Show
Trong hướng dẫn này, bạn sẽ tìm hiểu về những điều sau đây
Đây là một hướng dẫn toàn diện sẽ bao gồm rất nhiều nền tảng. Nếu bạn muốn xem nhanh cách gợi ý kiểu hoạt động trong Python và xem liệu kiểm tra kiểu 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 và sẽ cho bạn biết cách hoạt động của tính năng kiểm tra kiểu và các đề xuất về thời điểm nó sẽ hữu ích Tiền thưởng miễn phí. 5 Suy nghĩ về Làm chủ Python, một khóa học miễn phí dành cho các nhà phát triển Python cho bạn thấy lộ trình và tư duy mà bạn sẽ cần để đưa các kỹ năng Python của mình lên một tầm cao mới Loại hệ thốngTất cả các ngôn ngữ lập trình bao gồm một số loại hệ thống loại chính thức hóa các loại đối tượng mà nó có thể làm việc và cách các loại đó được xử lý. Chẳng hạn, một hệ thống loại có thể định nghĩa một loại số, với 09 là một ví dụ về đối tượng thuộc loại sốLoại bỏ các quảng cáoNhập độngPython là một ngôn ngữ được gõ động. Điều này có nghĩa là trình thông dịch Python chỉ kiểm tra kiểu khi mã chạy và kiểu của một biến được phép thay đổi trong suốt thời gian tồn tại của nó. Các ví dụ giả sau đây chứng minh rằng Python có kiểu gõ động >>>
Trong ví dụ đầu tiên, nhánh 10 không bao giờ chạy nên nó không bao giờ được kiểm tra loại. Ví dụ thứ hai cho thấy rằng khi đánh giá 10, nó sẽ tăng 12 vì bạn không thể cộng một số nguyên và một chuỗi trong PythonTiếp theo, hãy xem liệu các biến có thể thay đổi loại không >>>
13 trả về loại đối tượng. Những ví dụ này xác nhận rằng loại 14 được phép thay đổi và Python suy luận chính xác loại khi nó thay đổiNhập tĩnhNgược lại với 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. Trong hầu hết các ngôn ngữ được nhập tĩnh, chẳng hạn 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 kiểu gõ tĩnh, các biến thường không được phép thay đổi loại, mặc dù có thể tồn tại các cơ chế chuyển một biến sang một loại khác Hãy xem một ví dụ nhanh từ một ngôn ngữ được gõ tĩnh. Hãy xem xét đoạn mã Java sau ________số 8_______ Dòng đầu tiên tuyên bố rằng tên biến 14 được liên kết với loại 16 tại thời điểm biên dịch. Tên không bao giờ có thể được phục hồi thành loại khác. Ở dòng thứ hai, 14 đượ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à một đối tượng 16. Chẳng hạn, nếu sau này bạn nói 19 thì trình biên dịch sẽ báo lỗi do các kiểu không tương thíchPython sẽ luôn. Tuy nhiên, PEP 484 đã giới thiệu các gợi ý về kiểu, cho phép thực hiện kiểm tra kiểu 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 nhập tĩnh khác, bản thân các gợi ý nhập không khiến Python thực thi các loại. Đúng như tên gọi, gợi ý nhập chỉ đề xuất các loại. Có các công cụ khác, thực hiện kiểm tra kiểu tĩnh bằng gợi ý kiểu gõ vịtMột thuật ngữ khác thường được sử dụng khi nói về Python là duck typing. Biệt danh này bắt nguồn từ câu “nếu nó đi như vịt và kêu quạc quạc như vịt, thì nó phải là vịt” (hoặc ) 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 thức mà nó định nghĩa. Sử dụng cách gõ vịt bạn hoàn toà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 20 trên bất kỳ đối tượng Python nào xác định phương thức 21>>>
Lưu ý rằng cuộc gọi đến ____0_______20 đưa ra giá trị trả về của phương thức ___________21. Trên thực tế, việc triển khai 20 về cơ bản tương đương như sau
Để gọi 25, ràng buộc thực sự duy nhất đối với 26 là nó phải xác định một phương thức 21. Mặt khác, đối tượng có thể thuộc các loại khác nhau như 28, 29, 30 hoặc 31Kiểu gõ vịt được hỗ trợ phần nào khi thực hiện kiểm tra kiểu tĩnh của mã Python, sử dụng kiểu con cấu trúc. Bạn sẽ tìm hiểu sau Loại bỏ các quảng cáoxin chào các loạiTrong 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 biến một chuỗi văn bản thành một dòng tiêu đề bằng cách thêm cách viết hoa thích hợp và một dòng trang trí
Theo mặc định, hàm trả về dòng tiêu đề được căn trái với phần gạch chân. Bằng cách đặt cờ 32 thành 33, bạn có thể đặt dòng tiêu đề ở giữa với đường xung quanh là 34>>>
Đã đến lúc cho gợi ý loại đầu tiên của chúng tôi. Để thêm thông tin về các kiểu 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 35 nói rằng đối số 36 phải thuộc loại 28. Tương tự, đối số tùy chọn 32 phải có loại 39 với giá trị mặc định là 40. Cuối cùng, ký hiệu 41 xác định rằng 42 sẽ trả về một chuỗiVề phong cách, khuyến nghị như sau
Thêm 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 trên chính chúng. Chẳng hạn, nếu chúng ta sử dụng loại sai cho đối số (được đặt tên không hợp lệ) 32, thì mã vẫn chạy mà không có bất kỳ sự cố hoặc cảnh báo nào
Ghi chú. Lý do điều này có vẻ hiệu quả là chuỗi 49. Sử dụng 50 sẽ không có tác dụng mong muốn vì 51 cũng đúngĐể bắt loại lỗi này, bạn có thể sử dụng trình kiểm tra kiểu tĩnh. Nghĩa 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 sẵn trong trình soạn thảo của mình. Chẳng hạn, PyCharm ngay lập tức đưa ra cảnh báo cho bạn Tuy nhiên, công cụ phổ biến nhất để thực hiện kiểm tra kiểu là Mypy. Bạn sẽ nhận được phần 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 của nó Nếu bạn chưa có Mypy trên hệ thống của mình, bạn có thể cài đặt nó bằng cách sử dụng 52
Đặt đoạn mã sau vào tệp có tên 53 0Đây thực chất là mã giống như bạn đã thấy trước đó. định nghĩa của 42 và hai ví dụ đang sử dụng nóBây giờ hãy chạy Mypy trên mã này 1Dựa trên các gợi ý về loại, Mypy có thể cho chúng tôi biết rằng chúng tôi đang sử dụng loại sai 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ố 32 mà bạn đang chuyển vào. Bạn cũng có thể đổi tên cờ 32 thành tên nào đó ít khó hiểu hơn 2Ở đây bạn đã thay đổi 32 thành 58 và sử dụng đúng giá trị Boolean cho 58 khi gọi 42. Mã bây giờ vượt qua Mypy 3Thông báo thành công xác nhận không có lỗi loại nào được phát hiện. Các phiên bản Mypy cũ hơn được sử dụng để chỉ ra điều này bằng cách không hiển thị đầ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 4Dòng tiêu đề đầu tiên được căn sang trái, trong khi dòng thứ hai được căn giữa Loại bỏ các quảng cáoƯu và nhược điểmPhần trước đã cho bạn biết một chút về việc kiểm tra kiểu trong Python trông như thế nào. Bạn cũng đã thấy một ví dụ về một trong những ưu điểm của việc thêm các loại vào mã của bạn. gõ gợi ý giúp bắt lỗi nhất định. lợi thế khác bao gồm
Tất nhiên, kiểm tra kiểu tĩnh không phải là toàn đào và kem. Ngoài ra còn có một số nhược điểm bạn nên xem xét
Đo thời gian nhậpHiển thị/Ẩn Bạn sẽ tìm hiểu về mô-đun 62 và mức độ cần thiết của mô-đun này trong hầu hết các trường hợp khi bạn thêm gợi ý loại. Nhập mô-đun nhất thiết phải mất một thời gian, nhưng bao nhiêu?Để có một số ý tưởng về điều này, hãy tạo hai tệp. 64 phải là một tệp trống, trong khi 65 phải chứa dòng sau 5Trên Linux, khá dễ dàng để kiểm tra xem quá trình nhập 62 mất bao nhiêu thời gian bằng cách sử dụng tiện ích 67 6Vì vậy, việc chạy tập lệnh 68 mất khoảng 45 mili giây. Tất nhiên đây không phải là toàn bộ thời gian dành cho việc nhập khẩu 62. Một số trong số này là chi phí khởi động 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 7Dựa trên thử nghiệm này, quá trình nhập mô-đun 62 mất khoảng 17 mili giây trên Python 3. 6Một trong những cải tiến được quảng cáo trong Python 3. 7 là. Hãy xem nếu kết quả là khác nhau 8Thật vậy, thời gian khởi động chung giảm khoảng 8 mili giây và thời gian nhập 62 giảm từ 17 xuống còn khoảng 6 mili giây—nhanh hơn gần 3 lầnSử dụng 72Có 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 72 trong thư viện chuẩn. Thông thường, chúng tôi sẽ trực tiếp sử dụng 72 cho thời gian ở trên. Tuy nhiên, 72 gặp khó khăn trong việc xác định thời gian nhập một cách đáng tin cậy vì Python rất thông minh khi chỉ nhập các mô-đun một lần. Xem xét ví dụ sau 9Trong khi 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 những gì 67 đo được. Điều mà 72 đã thực sự làm là chạy câu lệnh 78 30 triệu lần, trong khi Python thực sự chỉ nhập 62 một lầnĐể có kết quả hợp lý, bạn có thể yêu cầu 72 chỉ chạy một lần 0Những kết quả này có cùng thang điểm với kết quả từ 67 ở trên. Tuy nhiên, vì chúng chỉ dựa trên một lần thực thi mã nên chúng không đáng tin cậy bằng những mã dựa trên nhiều lần chạyKết luận trong cả hai trường hợp này là việc nhập 62 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ể không thành vấn đềTùy chọn 83 mớiTrong Trăn 3. 7 cũng có một tùy chọn dòng lệnh mới có thể được sử dụng để tính thời gian nhập. Sử dụng 84, bạn sẽ nhận được báo cáo về tất cả các lần nhập được thực hiện 1Điều này cho thấy một kết quả tương tự. Quá trình nhập 62 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 86 và 87 mà 62 phụ thuộc vàoVì vậy, bạn có nên sử dụng kiểm tra kiểu tĩnh trong mã của riêng mình không? . 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ị trình kiểm tra loại tĩnh bỏ qua. 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ó tăng thêm giá trị cho bạn Nhìn vào danh sách ưu và nhược điểm ở trên, bạn sẽ nhận thấy rằng việc thêm các loại sẽ không ảnh hưởng đến 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 nhằm mục đích làm cho cuộc sống của bạn với tư cách là một nhà phát triển tốt hơn và thuận tiện hơn Một số quy tắc nhỏ về việc có nên thêm các loại vào dự án của bạn hay không là
Trong bài báo xuất sắc của mình The State of Type Hints in Python Bernát Gábor khuyến nghị rằng “nên sử dụng các gợi ý về 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ợi ý nhập đóng vai trò tương tự như các bài kiểm tra trong mã của bạn. họ giúp bạn với tư cách là nhà phát triển viết mã tốt hơn Hy vọng rằng bây giờ bạn đã có ý tưởng về cách hoạt động của kiểm tra kiểu trong Python và liệu đó có phải là thứ bạn muốn sử dụng trong các dự án của riêng mình không Trong phần còn lại của hướng dẫn này, chúng ta sẽ đi vào chi tiết hơn về hệ thống kiểu Python, bao gồm cách bạn chạy trình kiểm tra kiểu 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ần gợi ý kiểu và cách bạn Chú thíchChú thích đã được giới thiệu trong Python 3. 0, ban đầu không có mục đích cụ thể. 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ố của hàm và trả về các giá trị Nhiều năm sau, PEP 484 đã xác định cách thêm gợi ý kiểu 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. dự án—Mypy. Cách chính để thêm gợi ý loại là sử dụng chú thích. Vì việc kiểm tra kiểu ngày càng trở nên phổ biế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 ý kiểu Các phần tiếp theo giải thích cách chú thích hoạt động trong ngữ cảnh của gợi ý loại Chú thích chức năngĐối với các hàm, bạn có thể chú thích đối số và giá trị trả về. Điều này được thực hiện như sau 2Đối với các đối số, cú pháp là 91, trong khi kiểu trả về được chú thích bằng cách sử dụng 92. 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 chú thích cho hàm tính chu vi hình tròn 3Khi 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 93 đặc biệt trên hàm>>> 4Đôi khi bạn có thể bối rối về cách Mypy diễn giải các 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. 94 và 95. Bạn có thể thêm những mã này vào mã của mình trước khi chạy Mypy và Mypy sẽ báo cáo chính xác những loại mà nó đã suy luận. Ví dụ, lưu đoạn mã sau vào 96 5Tiếp theo, chạy mã này thông qua Mypy 6Ngay cả khi không có bất kỳ chú thích nào, Mypy đã suy luận chính xác các loại của biến ____ _ _ _ _ _ _ _ _ _ _ _ được tích hợp sẵn, cũng như các biến cục bộ của chúng ta _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Ghi chú. Các biểu thức tiết lộ chỉ có nghĩa là một công cụ giúp bạn thêm các loại và gỡ lỗi các gợi ý về loại của bạn. Nếu bạn cố chạy tệp 96 dưới dạng tập lệnh Python, nó sẽ gặp sự cố với 01 vì 94 không phải là hàm mà trình thông dịch Python biết đếnNếu Mypy nói rằng "Tên ' 03' không được xác định", bạn có thể cần cập nhật cài đặt Mypy của mình. The 95 expression is available in Mypy version 0. 610 trở lênLoại bỏ các quảng cáoChú thích biếnTrong định nghĩa của 05 ở phần trước, bạn chỉ chú thích đối số và giá trị trả về. Bạn đã không thêm bất kỳ chú thích nào bên trong thân hàm. 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 biến được định nghĩa trong PEP 526 và được giới thiệu trong Python 3. 6. Cú pháp giống như đối với chú thích đối số hàm 7Biến 06 đã được chú thích với gợi ý loại 07Ghi chú. Trình kiểm tra loại tĩnh có nhiều khả năng phát hiện ra rằng 08 là số float, vì vậy trong ví dụ này, chú thích của 06 là không cần thiết. Khi tìm hiểu thêm về hệ thống kiểu Python, bạn sẽ thấy nhiều ví dụ liên quan hơn về chú thích biếnChú thích của các biến được lưu trữ trong từ điển cấp độ mô-đun 10>>> 8Bạn được phép chú thích một biến mà không cần đặt giá trị cho nó. Điều này thêm chú thích vào từ điển 10, trong khi biến vẫn chưa được xác định>>> 9Vì không có giá trị nào được gán cho 12 nên tên 12 vẫn chưa được xác địnhLoại Nhận xétNhư đã đề cập, các chú thích đã được giới thiệu trong Python 3 và chúng chưa được nhập vào Python 2. Điều này có nghĩa là nếu bạn đang viết mã cần hỗ trợ Python cũ, thì bạn không thể sử dụng chú thích Thay vào đó, bạn có thể sử dụng loại bình luận. Đây là những nhận xét được định dạng đặc biệt có thể được sử dụng để thêm gợi ý loại tương thích với mã cũ hơn. Để thêm nhận xét loại vào một chức năng, bạn làm như thế này 0Các nhận xét loại chỉ là nhận xét, vì vậy chúng có thể được sử dụng trong bất kỳ phiên bản Python nào Nhận xét loại được xử lý trực tiếp bởi trình kiểm tra loại, vì vậy những loại này không có trong từ điển 10>>> 1Chú thích loại phải bắt đầu bằng _______ 15 chữ và ở cùng dòng hoặc dòng sau với định nghĩa hàm. Nếu bạn muốn chú thích một hàm có nhiều đối số, bạn viết từng loại cách nhau bằng dấu phẩy 2Bạn cũng được phép viết mỗi đối số trên một dòng riêng biệt với chú thích riêng của nó 3Chạy ví dụ thông qua Python và Mypy 4Nếu bạn có sai sót, chẳng hạn nếu bạn tình cờ gọi cho 42 với 17 trên dòng 10, Mypy sẽ cho bạn biết 5Bạn cũng có thể thêm nhận xét kiểu vào biến. Điều này được thực hiện tương tự như cách bạn thêm nhận xét loại vào đối số 6Trong ví dụ này, 06 sẽ được kiểm tra kiểu dưới dạng biến floatLoại bỏ các quảng cáoVì vậy, Nhập Chú thích hoặc Nhập Nhận xét?Bạn có nên sử dụng chú thích hoặc nhập nhận xét khi thêm gợi ý loại vào mã của riêng mình không? . Sử dụng chú thích nếu bạn có thể, sử dụng nhận xét loại nếu bạn phải Chú thích cung cấp cú pháp rõ ràng hơn để giữ thông tin loại gần với mã của bạn hơn. Chúng cũng là cách viết gợi ý loại chính thức được đề xuất và sẽ được phát triển thêm cũng như duy trì đúng cách trong tương lai Loại nhận xét dài dòng hơn và có thể xung đột với các loại nhận xét khác trong mã của bạn như chỉ thị kẻ nói dối. Tuy nhiên, chúng có thể được sử dụng trong các cơ sở mã không hỗ trợ chú thích Ngoài ra còn có tùy chọn ẩn số ba. tập tin sơ khai. Bạn sẽ tìm hiểu về những điều này sau, khi chúng ta thảo luận Các tệp sơ khai sẽ hoạt động trong mọi phiên bản Python, với chi phí phải duy trì một bộ tệp thứ hai. Nói chung, bạn chỉ muốn sử dụng các tệp sơ khai nếu bạn không thể thay đổi mã nguồn ban đầu Chơi với các loại Python, Phần 1Cho đến bây giờ, bạn chỉ sử dụng các loại cơ bản như 28, 07 và 39 trong gợi ý loại của mình. Hệ thống loại Python khá mạnh và hỗ trợ nhiều loại phức tạp hơn. Điều này là cần thiết vì nó cần có khả năng mô hình hóa hợp lý bản chất gõ vịt năng động của PythonTrong phần này, bạn sẽ tìm hiểu thêm về hệ thống loại này, trong khi thực hiện một trò chơi bài đơn giản. Bạn sẽ thấy cách chỉ định
Sau một đường vòng ngắn vào một số bạn sẽ thấy. Bạn có thể tìm thấy các ví dụ về mã từ phần này tại đây Ví dụ. Một cỗ bàiVí dụ sau đây cho thấy việc triển khai một bộ bài thông thường (tiếng Pháp) 7Mỗi thẻ được biểu diễn dưới dạng một bộ chuỗi biểu thị chất và thứ hạng. Bộ bài được thể hiện dưới dạng một danh sách các quân bài. 22 tạo một bộ bài thông thường gồm 52 quân bài và tùy ý xáo bài. 23 chia bộ bài cho bốn người chơiCuối cùng, 24 chơi trò chơi. Hiện tại, nó chỉ chuẩn bị cho một trò chơi bài bằng cách xây dựng một cỗ bài xáo trộn và chia bài cho từng người chơi. Sau đây là một đầu ra điển hình 8Bạn sẽ thấy cách mở rộng ví dụ này thành một trò chơi thú vị hơn khi chúng ta tiếp tục Trình tự và ánh xạHãy thêm gợi ý loại vào trò chơi bài của chúng tôi. Nói cách khác, hãy chú thích các hàm 22, 23 và 24. Thách thức đầu tiên là bạn cần chú thích các loại tổng hợp như danh sách được sử dụng để đại diện cho cỗ bài và các bộ được sử dụng để đại diện cho chính các quân bàiVới các loại đơn giản như 28, 07 và 39, việc thêm gợi ý loại dễ dàng như sử dụng chính loại đó>>> 9Với các loại hỗn hợp, bạn được phép làm tương tự >>> 0Tuy nhiên, điều này không thực sự nói lên toàn bộ câu chuyện. Các loại 31, 32 và 33 sẽ là gì? . Tuy nhiên, bản thân các gợi ý loại không cung cấp thông tin về điều nàyThay vào đó, bạn nên sử dụng các loại đặc biệt được xác định trong mô-đun 62. Các loại này thêm cú pháp để chỉ định các loại phần tử của các loại tổng hợp. Bạn có thể viết như sau>>> 1Lưu ý rằng mỗi loại trong số này bắt đầu bằng chữ in hoa và tất cả chúng đều sử dụng dấu ngoặc vuông để xác định loại mục
Mô-đun 62 chứa nhiều loại phức hợp hơn, bao gồm 42, 43, 44, 45 và 46. Ngoài ra, mô-đun bao gồm các loại khác mà bạn sẽ thấy trong các phần sauHãy trở lại với trò chơi bài. Một thẻ được đại diện bởi một bộ gồm hai chuỗi. Bạn có thể viết cái này là 47, vì vậy loại bộ bài sẽ trở thành 48. Do đó bạn có thể chú thích 22 như sau 2Ngoài giá trị trả về, bạn cũng đã thêm loại 39 vào đối số tùy chọn 51Ghi chú. Tuples và danh sách được chú thích khác nhau Bộ dữ liệu là một chuỗi bất biến và thường bao gồm một số lượng cố định các phần tử có thể được nhập khác nhau. Ví dụ: chúng tôi đại diện cho một thẻ dưới dạng một bộ phù hợp và xếp hạng. Nói chung, bạn viết 52 cho n-tupleDanh sách là một dãy có thể thay đổi và thường bao gồm một số phần tử cùng loại không xác định, ví dụ: danh sách các thẻ. Cho dù có bao nhiêu phần tử trong danh sách thì chỉ có một loại trong chú thích. 53Trong nhiều trường hợp, các chức năng của bạn sẽ mong đợi một số loại và không thực sự quan tâm đó là danh sách hay bộ. Trong những trường hợp này, bạn nên sử dụng 54 khi chú thích đối số hàm 3Sử dụng 55 là một ví dụ về cách sử dụng kiểu gõ vịt. Một 55 là bất cứ thứ gì hỗ trợ 20 và 58, không phụ thuộc vào loại thực tế của nóLoại bỏ các quảng cáoNhập bí danhGợi ý loại có thể trở nên khá xiên xẹo khi làm việc với các loại lồng nhau như cỗ bài. You may need to stare at 48 a bit before figuring out that it matches our representation of a deck of cardsBây giờ hãy xem xét cách bạn sẽ chú thích 23 4Điều đó thật kinh khủng Nhớ lại rằng các chú thích loại là các biểu thức Python thông thường. Điều đó có nghĩa là bạn có thể xác định bí danh kiểu của riêng mình bằng cách gán chúng cho các biến mới. Ví dụ, bạn có thể tạo bí danh loại 61 và 62 5 61 hiện có thể được sử dụng trong gợi ý loại hoặc trong định nghĩa bí danh loại mới, như 62 trong ví dụ trênSử dụng các bí danh này, các chú thích của 23 trở nên dễ đọc hơn nhiều 6Bí danh loại rất tốt để làm cho mã của bạn và ý định của nó rõ ràng hơn. Đồng thời, những bí danh này có thể được kiểm tra để xem những gì chúng đại diện >>> 7Lưu ý rằng khi in 62, nó hiển thị rằng đó là bí danh cho danh sách gồm 2 bộ chuỗiCác hàm không có giá trị trả vềBạn có thể biết rằng các hàm không có trả về rõ ràng vẫn trả về 67>>> 8Mặc dù các chức năng như vậy về mặt kỹ thuật trả về một cái gì đó, nhưng giá trị trả về đó không hữu ích. Bạn nên thêm các gợi ý loại bằng cách sử dụng 67 cũng như loại trả về 9Các chú thích giúp phát hiện các loại lỗi tinh vi mà bạn đang cố gắng sử dụng một giá trị trả về vô nghĩa. Mypy sẽ cung cấp cho bạn một cảnh báo hữu ích 0Lưu ý rằng rõ ràng về một hàm không trả về bất cứ thứ gì khác với việc không thêm gợi ý kiểu về giá trị trả về 1Trong trường hợp sau này, Mypy không có thông tin về giá trị trả về nên nó sẽ không tạo ra bất kỳ cảnh báo nào 2Trong một trường hợp kỳ lạ hơn, lưu ý rằng bạn cũng có thể chú thích các chức năng không bao giờ được mong đợi sẽ trở lại bình thường. Điều này được thực hiện bằng cách sử dụng 3Vì 70 luôn đưa ra một ngoại lệ, nên nó sẽ không bao giờ trả về đúng cáchLoại bỏ các quảng cáoVí dụ. Chơi một số thẻHãy trở lại với chúng tôi. Trong phiên bản thứ hai này của trò chơi, chúng tôi chia bài cho mỗi người chơi như trước đây. Sau đó, một người chơi bắt đầu được chọn và những người chơi lần lượt chơi bài của họ. Tuy nhiên, thực sự không có bất kỳ quy tắc nào trong trò chơi, vì vậy người chơi sẽ chỉ chơi các quân bài ngẫu nhiên. 4Lưu ý rằng ngoài việc thay đổi 24, chúng tôi đã thêm hai chức năng mới cần gợi ý loại. 72 và 73. Trước khi thảo luận về cách chúng tôi sẽ thêm gợi ý loại cho chúng, đây là một kết quả ví dụ khi chạy trò chơi 5Trong ví dụ này, người chơi 74 được chọn ngẫu nhiên làm người chơi bắt đầu. Đổi lại, mỗi người chơi đánh một quân bài. đầu tiên là 74, sau đó là 76, sau đó là 77, và cuối cùng là 78. Người chơi tiếp tục chơi bài miễn là họ còn bài trong tayLoại String thing; thing = "Hello"; 79 72 hoạt động cho cả danh sách tên và danh sách thẻ (và bất kỳ trình tự nào khác cho vấn đề đó). Một cách để thêm gợi ý loại cho điều này sẽ như sau 6Điều này ít nhiều có nghĩa là những gì nó nói. 81 là một chuỗi có thể chứa các mục thuộc bất kỳ loại nào và 72 sẽ trả về một mục như vậy thuộc bất kỳ loại nào. Thật không may, điều này không hữu ích. Xem xét ví dụ sau 7Mặc dù Mypy sẽ suy luận chính xác rằng 38 là một danh sách các chuỗi, nhưng thông tin đó sẽ bị mất sau khi gọi tới ____8_______72 do sử dụng loại ___8_______79 8Bạn sẽ sớm thấy một cách tốt hơn. First though, let’s have a more theoretical look at the Python type system, and the special role 79 playsLoại lý thuyếtHướng dẫn này chủ yếu là một hướng dẫn thực tế và chúng tôi sẽ chỉ vạch ra bề nổi của lý thuyết làm cơ sở cho các gợi ý về loại Python. Để biết thêm chi tiết PEP 483 là một điểm khởi đầu tốt. Nếu bạn muốn quay lại các ví dụ thực tế, vui lòng tiểu loạiMột khái niệm quan trọng là các kiểu con. Chính thức, chúng tôi nói rằng một loại 87 là một loại phụ của 88 nếu hai điều kiện sau thỏa mãn
Hai điều kiện này đảm bảo rằng ngay cả khi loại 87 khác với 88, các biến loại 87 luôn có thể giả vờ là 88Đối với một ví dụ cụ thể, hãy xem xét 97 và 98. Loại 39 chỉ nhận hai giá trị. Thông thường, chúng được ký hiệu là 40 và 33, nhưng những tên này chỉ là bí danh cho các giá trị số nguyên lần lượt là 02 và 03>>> 9Vì 0 và 1 đều là số nguyên nên điều kiện đầu tiên thỏa mãn. Ở trên, bạn có thể thấy rằng Booleans có thể được cộng lại với nhau, nhưng chúng cũng có thể làm bất cứ điều gì khác mà số nguyên có thể. Đây là điều kiện thứ hai ở trên. Nói cách khác, 39 là một kiểu con của 35Tầm quan trọng của các kiểu con là một kiểu con luôn có thể giả vờ là siêu kiểu của nó. Chẳng hạn, loại mã sau đây kiểm tra là chính xác 0Các kiểu con có phần nào liên quan đến các lớp con. Trong thực tế, tất cả các lớp con tương ứng với các kiểu con, và 39 là một kiểu con của 35 bởi vì 39 là một lớp con của 35. Tuy nhiên, cũng có những kiểu con không tương ứng với lớp con. Ví dụ: 35 là một kiểu con của 07, nhưng 35 không phải là một lớp con của 07Loại bỏ các quảng cáoCovariant, Contravariant, và InvariantĐiều gì xảy ra khi bạn sử dụng các kiểu con bên trong các kiểu tổng hợp? . Điều này trở nên nhanh chóng về mặt kỹ thuật, vì vậy hãy chỉ đưa ra một vài ví dụ
Nói chung, bạn không cần phải giữ những biểu thức này thẳng. Tuy nhiên, bạn nên lưu ý rằng các kiểu con và kiểu tổng hợp có thể không đơn giản và trực quan Nhập dần dần và các loại nhất quánTrước đó, chúng tôi đã đề cập rằng Python hỗ trợ gõ dần dần, trong đó bạn có thể dần dần thêm gợi ý kiểu vào mã Python của mình. Đánh máy dần dần về cơ bản có thể thực hiện được bằng loại 79Bằng cách nào đó, 79 nằm ở cả trên cùng và dưới cùng của hệ thống phân cấp loại của các loại phụ. Bất kỳ loại nào hoạt động như thể nó là một kiểu con của 79 và 79 hoạt động như thể nó là một kiểu con của bất kỳ loại nào khác. Nhìn vào định nghĩa của các kiểu con ở trên, điều này thực sự không thể. Thay vào đó chúng ta nói về các loại nhất quánLoại 87 phù hợp với loại 88 nếu 87 là một loại con của 88 hoặc một trong hai loại 87 hoặc 88 là 79Trình kiểm tra loại chỉ phàn nàn về các loại không nhất quán. Do đó, điều rút ra là bạn sẽ không bao giờ thấy lỗi loại phát sinh từ loại 79Điều này có nghĩa là bạn có thể sử dụng 79 để quay trở lại kiểu nhập động một cách rõ ràng, mô tả các loại quá phức tạp để mô tả trong hệ thống loại Python hoặc mô tả các mục trong các loại hỗn hợp. Chẳng hạn, một từ điển có các khóa chuỗi có thể lấy bất kỳ loại nào làm giá trị của nó có thể được chú thích 50Tuy nhiên, hãy nhớ rằng nếu bạn sử dụng 79 thì trình kiểm tra kiểu tĩnh sẽ không thực hiện bất kỳ kiểu kiểm tra nào.Chơi với các loại Python, Phần 2Hãy trở lại với các ví dụ thực tế của chúng tôi. Nhớ lại rằng bạn đang cố chú thích hàm 72 chung 6Vấn đề với việc sử dụng 79 là bạn đang mất thông tin loại một cách không cần thiết. You know that if you pass a list of strings to 72, it will return a string. Dưới đây, bạn sẽ thấy cách thể hiện điều này bằng cách sử dụng các biến kiểu, cũng như cách làm việc với
Loại biếnBiến kiểu là một biến đặc biệt có thể nhận bất kỳ kiểu nào, tùy thuộc vào tình huống Hãy tạo một biến kiểu sẽ gói gọn hành vi của 72 một cách hiệu quả 2Biến loại phải được xác định bằng cách sử dụng 57 từ mô-đun 62. Khi được sử dụng, một biến loại bao gồm tất cả các loại có thể và lấy loại cụ thể nhất có thể. Trong ví dụ, 59 bây giờ là một 28 3Hãy xem xét một vài ví dụ khác 4Hai ví dụ đầu tiên nên có loại 28 và 35, nhưng còn hai ví dụ cuối cùng thì sao? 5Như bạn đã thấy, 39 là một kiểu con của 35, một lần nữa là một kiểu con của 07. Vì vậy, trong ví dụ thứ ba, giá trị trả về của 72 được đảm bảo là thứ có thể được coi là một 07. Trong ví dụ trước, không có mối quan hệ kiểu con nào giữa 28 và 35, vì vậy điều tốt nhất có thể nói về giá trị trả về là nó là một đối tượngLưu ý rằng không có ví dụ nào trong số này gây ra lỗi loại. Có cách nào để báo cho trình kiểm tra loại biết rằng 72 nên chấp nhận cả chuỗi và số, nhưng không chấp nhận cả hai cùng một lúc không?Bạn có thể hạn chế các biến kiểu bằng cách liệt kê các kiểu được chấp nhận 6Bây giờ 63 chỉ có thể là 28 hoặc 07 và Mypy sẽ lưu ý rằng ví dụ cuối cùng là một lỗi 7Cũng lưu ý rằng trong ví dụ thứ hai, loại được coi là 07 mặc dù danh sách đầu vào chỉ chứa 35 đối tượng. Điều này là do 63 bị hạn chế đối với chuỗi và số float và 35 là một kiểu con của 07Trong trò chơi bài của chúng tôi, chúng tôi muốn hạn chế sử dụng 72 cho 28 và 61 8Chúng tôi đã đề cập ngắn gọn rằng 55 đại diện cho cả danh sách và bộ dữ liệu. Như chúng tôi đã lưu ý, một 55 có thể được coi là một loại vịt, vì nó có thể là bất kỳ đối tượng nào có triển khai 21 và 58Loại bỏ các quảng cáoCác loại vịt và giao thứcNhớ lại ví dụ sau từ
20 có thể trả về độ dài của bất kỳ đối tượng nào đã triển khai phương thức 21. Làm cách nào chúng ta có thể thêm các gợi ý loại vào 20 và đặc biệt là đối số 26?Câu trả lời ẩn đằng sau phân nhóm cấu trúc thuật ngữ nghe có vẻ hàn lâm. Một cách để phân loại các hệ thống loại là xem chúng là danh nghĩa hay cấu trúc.
There is ongoing work to bring a full-fledged structural type system to Python through PEP 544 which aims at adding a concept called protocols. Most of PEP 544 is already implemented in Mypy though A protocol specifies one or more methods that must be implemented. For example, all classes defining 21 fulfill the 96 protocol. We can therefore annotate 20 as follows 0Other defined in the 62 module include 99, 00, 01, and 02You can also define your own protocols. This is done by inheriting from 03 and defining the function signatures (with empty function bodies) that the protocol expects. The following example shows how 20 and 93 could have been implemented 1At the time of writing the support for self-defined protocols is still experimental and only available through the 06 module. This module must be explicitly installed from PyPI by doing 07The def len(obj): return obj.__len__() 08 TypeA common pattern in Python is to use 67 as a default value for an argument. This is usually done either to avoid problems with mutable default values or to have a sentinel value flagging special behaviorIn the card example, the 73 function uses 67 as a sentinel value for 12 saying that if no start player is given it should be chosen randomly 2The challenge this creates for type hinting is that in general 12 should be a string. However, it may also take the special non-string value 67Để chú thích các đối số như vậy, bạn có thể sử dụng loại 08 3The 08 type simply says that a variable either has the type specified or is 67. An equivalent way of specifying the same would be using the 18 type. 19Note that when using either 08 or 18 you must take care that the variable has the correct type when you operate on it. This is done in the example by testing whether 22. Không làm như vậy sẽ gây ra cả lỗi kiểu tĩnh cũng như lỗi thời gian chạy có thể xảy ra 4Mypy tells you that you have not taken care of the case where 12 is 67 5Note. The use of 67 for optional arguments is so common that Mypy handles it automatically. Mypy assumes that a default argument of 67 indicates an optional argument even if the type hint does not explicitly say so. You could have used the following 6If you don’t want Mypy to make this assumption you can turn it off with the 27 command line optionLoại bỏ các quảng cáoExample. The Object(ive) of the GameLet’s rewrite the card game to be more object-oriented. This will allow us to discuss how to properly annotate classes and methods A more or less direct translation of our card game into code that uses classes for 61, 62, 30, and 31 looks something like the following 7Now let’s add types to this code Type Hints for MethodsFirst of all type hints for methods work much the same as type hints for functions. The only difference is that the 32 argument need not be annotated, as it always will be a class instance. The types of the 61 class are easy to add 8Note that the 34 method always should have 67 as its return typeClasses as TypesThere is a correspondence between classes and types. For example, all instances of the 61 class together form the 61 type. To use classes as types you simply use the name of the classFor example, a 62 essentially consists of a list of 61 objects. You can annotate this as follows 9Mypy is able to connect your use of 61 in the annotation with the definition of the 61 classThis doesn’t work as cleanly though when you need to refer to the class currently being defined. For example, the 42 class method returns an object with type 62. However, you can’t simply add 44 as the 62 class is not yet fully definedInstead, you are allowed to use string literals in annotations. These strings will only be evaluated by the type checker later, and can therefore contain self and forward references. The 46 method should use such string literals for its types 0Note that the 30 class also will reference the 62 class. This is however no problem, since 62 is defined before 30 1Usually annotations are not used at runtime. This has given wings to the idea of postponing the evaluation of annotations. Instead of evaluating annotations as Python expressions and storing their value, the proposal is to store the string representation of the annotation and only evaluate it when needed Chức năng như vậy được lên kế hoạch để trở thành tiêu chuẩn trong Python 4 vẫn còn là thần thoại. 0. However, in Python 3. 7 and later, forward references are available through a 51 import 2With the 51 import you can use 62 instead of 54 even before 62 is definedReturning def len(obj): return obj.__len__() 32 or def len(obj): return obj.__len__() 57As noted, you should typically not annotate the 32 or 57 arguments. Một phần, điều này là không cần thiết vì 32 trỏ đến một thể hiện của lớp, vì vậy nó sẽ có kiểu của lớp. Trong ví dụ về 61, 32 có kiểu ngầm định là 61. Ngoài ra, việc thêm loại này một cách rõ ràng sẽ rất cồng kềnh vì lớp chưa được xác định. Bạn sẽ phải sử dụng cú pháp chuỗi ký tự, 64Tuy nhiên, có một trường hợp bạn có thể muốn chú thích 32 hoặc 57. Xem xét điều gì sẽ xảy ra nếu bạn có một siêu lớp mà các lớp khác kế thừa từ đó và có các phương thức trả về 32 hoặc 57 3Trong khi mã chạy không có vấn đề, Mypy sẽ đánh dấu sự cố 4Vấn đề là mặc dù các phương thức kế thừa 69 và 70 sẽ trả về một 71 nhưng chú thích nói rằng chúng trả về một 72Trong những trường hợp như thế này, bạn muốn cẩn thận hơn để đảm bảo chú thích là chính xác. Loại trả về phải khớp với loại 32 hoặc loại đối tượng của 57. Điều này có thể được thực hiện bằng cách sử dụng các biến kiểu theo dõi những gì thực sự được chuyển đến 32 và 57 5Có một vài điều cần lưu ý trong ví dụ này
Chú thích def len(obj): return obj.__len__() 86 và def len(obj): return obj.__len__() 87Trong trò chơi, chúng tôi đã thêm tùy chọn đặt tên cho người chơi trên dòng lệnh. Điều này được thực hiện bằng cách liệt kê tên người chơi sau tên của chương trình 6Điều này được thực hiện bằng cách giải nén và chuyển vào 88 đến 89 khi nó được khởi tạo. Phương thức 34 sử dụng 91 để đóng gói các tên đã cho vào một bộ dữ liệuVề chú thích loại. mặc dù 38 sẽ là một bộ chuỗi, bạn chỉ nên chú thích loại của từng tên. Nói cách khác, bạn nên sử dụng 28 chứ không phải 94 7Tương tự, nếu bạn có một hàm hoặc phương thức chấp nhận 87, thì bạn chỉ nên chú thích loại của từng đối số từ khóa có thểCó thể gọiHàm là đối tượng hạng nhất trong Python. Điều này có nghĩa là bạn có thể sử dụng các hàm làm đối số cho các hàm khác. Điều đó cũng có nghĩa là bạn cần có thể thêm các gợi ý kiểu đại diện cho các chức năng Hàm, cũng như lambda, phương thức và lớp, là. Các loại đối số và giá trị trả về cũng thường được biểu diễn. Chẳng hạn, 97 đại diện cho một hàm có ba đối số với các loại lần lượt là 98, 99 và 00. Kiểu trả về của hàm là 01Trong ví dụ sau, hàm 02 gọi một hàm đã cho hai lần và in các giá trị trả về 8Lưu ý chú thích của đối số 03 cho 02 trên dòng 5. Nó nói rằng 03 phải là một đối số có thể gọi được với một đối số chuỗi, điều đó cũng trả về một chuỗi. Một ví dụ về khả năng gọi như vậy là 06 được xác định trên dòng 9Hầu hết các loại có thể gọi được có thể được chú thích theo cách tương tự. Tuy nhiên, nếu bạn cần linh hoạt hơn, hãy kiểm tra và Ví dụ. trái timHãy kết thúc với một ví dụ đầy đủ về trò chơi Hearts. Bạn có thể đã biết trò chơi này từ các mô phỏng máy tính khác. Dưới đây là tóm tắt nhanh các quy tắc
Thông tin chi tiết có thể được tìm thấy trực tuyến Không có nhiều khái niệm gõ mới trong ví dụ này mà bạn chưa thấy. Do đó, chúng tôi sẽ không xem xét chi tiết mã này mà để nó làm ví dụ về mã chú thích Mã nguồn cho trò chơi bài HeartsHiển thị/Ẩn Bạn có thể tải xuống mã này và các ví dụ khác từ GitHub 9Dưới đây là một vài điểm cần lưu ý trong mã
Khi bắt đầu trò chơi, bạn điều khiển người chơi đầu tiên. Nhập số để chọn thẻ để chơi. Sau đây là một ví dụ về cách chơi trò chơi, với các dòng được đánh dấu cho biết nơi người chơi đưa ra lựa chọn 0Kiểm tra loại tĩnhCho đến giờ, bạn đã biết cách thêm gợi ý loại vào mã của mình. Trong phần này, bạn sẽ tìm hiểu thêm về cách thực sự kiểm tra kiểu tĩnh của mã Python Dự án MypyMypy đã được bắt đầu bởi Jukka Lehtosalo trong thời gian tiến sĩ của mình. D. học tại Cambridge khoảng năm 2012. Mypy ban đầu được hình dung là một biến thể Python với kiểu gõ động và tĩnh liền mạch. Xem các slide của Jukka từ PyCon Phần Lan 2012 để biết ví dụ về tầm nhìn ban đầu của Mypy Hầu hết những ý tưởng ban đầu đó vẫn đóng một vai trò quan trọng trong dự án Mypy. Trên thực tế, khẩu hiệu “Gõ động và tĩnh liền mạch” vẫn hiển thị nổi bật trên trang chủ của Mypy và mô tả rõ động cơ thúc đẩy sử dụng các gợi ý kiểu trong Python Thay đổi lớn nhất kể từ năm 2012 là Mypy không còn là một biến thể của Python. Trong các phiên bản đầu tiên, Mypy là một ngôn ngữ độc lập tương thích với Python ngoại trừ các khai báo kiểu của nó. Theo gợi ý của Guido van Rossum, Mypy đã được viết lại để sử dụng chú thích thay thế. Hôm nay Mypy là trình kiểm tra kiểu tĩnh cho mã Python thông thường Chạy MypyTrước khi chạy Mypy lần đầu tiên, bạn phải cài đặt chương trình. Điều này được thực hiện dễ dàng nhất bằng cách sử dụng 52
Với Mypy được cài đặt, bạn có thể chạy nó như một chương trình dòng lệnh thông thường 2Chạy Mypy trên tệp Python 14 của bạn sẽ kiểm tra lỗi loại mà không thực sự thực thi mãCó nhiều tùy chọn có sẵn khi gõ kiểm tra mã của bạn. Vì Mypy vẫn đang được phát triển rất tích cực, các tùy chọn dòng lệnh có thể thay đổi giữa các phiên bản. Bạn nên tham khảo phần trợ giúp của Mypy để xem cài đặt nào là mặc định trên phiên bản của bạn 3Ngoài ra, có rất nhiều thông tin Hãy xem xét một số tùy chọn phổ biến nhất. Trước hết, nếu bạn đang sử dụng các gói của bên thứ ba không có gợi ý loại, bạn có thể muốn tắt tiếng các cảnh báo của Mypy về những. Điều này có thể được thực hiện với tùy chọn 15Ví dụ sau sử dụng Numpy để tính và in cosin của một số số 4Lưu ý rằng 16 chỉ có trong phiên bản 1. 15 trở lên của Numpy. Chạy ví dụ này sẽ in một số số ra bàn điều khiển 5Đầu ra thực tế của ví dụ này không quan trọng. Tuy nhiên, bạn nên lưu ý rằng đối số 17 được chú thích bằng 18 trên dòng 5, vì chúng tôi muốn in cosin của một dãy số đầy đủBạn có thể chạy Mypy trên tệp này như bình thường 6Những cảnh báo này có thể không có ý nghĩa ngay lập tức đối với bạn, nhưng bạn sẽ sớm tìm hiểu về nó. Về cơ bản, bạn có thể đọc các cảnh báo khi Mypy nói rằng gói Numpy không chứa các gợi ý về loại Trong hầu hết các trường hợp, các gợi ý loại bị thiếu trong các gói của bên thứ ba không phải là điều bạn muốn làm phiền, vì vậy bạn có thể tắt các tin nhắn này 7Nếu bạn sử dụng tùy chọn dòng lệnh 19, Mypy sẽ. Tuy nhiên, điều này có thể hơi nặng tay vì nó cũng bỏ qua các lỗi thực tế, chẳng hạn như viết sai chính tả tên của một góiHai cách ít xâm phạm hơn để xử lý các gói của bên thứ ba là sử dụng nhận xét loại hoặc tệp cấu hình Trong một ví dụ đơn giản như ví dụ trên, bạn có thể tắt tiếng cảnh báo 20 bằng cách thêm một nhận xét loại vào dòng chứa nội dung nhập 8 21 theo nghĩa đen bảo Mypy bỏ qua việc nhập NumpyNếu bạn có nhiều tệp, việc theo dõi những lần nhập nào cần bỏ qua trong tệp cấu hình có thể dễ dàng hơn. Mypy đọc một tệp có tên là 22 trong thư mục hiện tại nếu nó hiện diện. Tệp cấu hình này phải chứa một phần có tên là 23 và có thể chứa các phần cụ thể của mô-đun có dạng 24Tệp cấu hình sau sẽ bỏ qua gợi ý loại Numpy bị thiếu 9Có nhiều tùy chọn có thể được chỉ định trong tệp cấu hình. Cũng có thể chỉ định một tệp cấu hình chung. Xem tài liệu để cho biết thêm thông tin chi tiết Thêm sơ khaiGợi ý loại có sẵn cho tất cả các gói trong thư viện chuẩn Python. Tuy nhiên, nếu bạn đang sử dụng các gói của bên thứ ba, bạn đã thấy rằng tình huống có thể khác Ví dụ sau sử dụng gói Parse để thực hiện phân tích cú pháp văn bản đơn giản. Để làm theo, trước tiên bạn nên cài đặt Parse 00Phân tích cú pháp có thể được sử dụng để nhận dạng các mẫu đơn giản. Đây là một chương trình nhỏ cố gắng hết sức để tìm ra tên của bạn 01Luồng chính được xác định trong ba dòng cuối cùng. hỏi tên của bạn, phân tích câu trả lời và in lời chào. Gói 25 được gọi ở dòng 14 để cố gắng tìm tên dựa trên một trong các mẫu được liệt kê ở dòng 7-11Chương trình có thể được sử dụng như sau 02Lưu ý rằng mặc dù tôi trả lời 26, nhưng chương trình chỉ ra rằng 27 không phải là một phần tên của tôiHãy thêm một lỗi nhỏ vào chương trình và xem liệu Mypy có thể giúp chúng tôi phát hiện ra nó không. Thay đổi dòng 16 từ 28 thành 29. Điều này sẽ trả về một đối tượng 30 thay vì chuỗi chứa tênTiếp theo chạy Mypy trên chương trình 03Mypy in một lỗi tương tự như lỗi bạn đã thấy trong phần trước. Nó không biết về gói 25. Bạn có thể thử bỏ qua việc nhập 04Thật không may, bỏ qua quá trình nhập có nghĩa là Mypy không có cách nào phát hiện ra lỗi trong chương trình của chúng tôi. Một giải pháp tốt hơn là thêm các gợi ý loại vào chính gói Parse. Vì Parse là nguồn mở, bạn thực sự có thể thêm các loại vào mã nguồn và gửi yêu cầu kéo Ngoài ra, bạn có thể thêm các loại trong tệp sơ khai. Tệp sơ khai là một tệp văn bản chứa chữ ký của các phương thức và hàm, nhưng không chứa các triển khai của chúng. Chức năng chính của chúng là thêm các gợi ý kiểu vào mã mà bạn không thể thay đổi vì lý do nào đó. Để hiển thị cách thức hoạt động của nó, chúng tôi sẽ thêm một số sơ khai cho gói Parse Trước hết, bạn nên đặt tất cả các tệp sơ khai của mình vào trong một thư mục chung và đặt biến môi trường 32 để trỏ đến thư mục này. Trên Mac và Linux, bạn có thể đặt 32 như sau 05Bạn có thể đặt biến vĩnh viễn bằng cách thêm dòng vào tệp 34 của mình. Trên Windows, bạn có thể nhấp vào menu bắt đầu và tìm kiếm các biến môi trường để đặt 32Tiếp theo, tạo một tệp bên trong thư mục sơ khai của bạn mà bạn gọi là 36. Nó phải được đặt tên cho gói mà bạn đang thêm gợi ý loại, với hậu tố 37. Để trống tập tin này ngay bây giờ. Sau đó chạy lại Mypy 06Nếu bạn đã thiết lập mọi thứ chính xác, bạn sẽ thấy thông báo lỗi mới này. Mypy sử dụng tệp 36 mới để tìm ra chức năng nào có sẵn trong gói 25. Vì tệp sơ khai trống, Mypy giả định rằng 40 không tồn tại và sau đó đưa ra lỗi mà bạn thấy ở trênVí dụ sau không thêm các loại cho toàn bộ gói 25. Thay vào đó, nó hiển thị gợi ý loại mà bạn cần thêm để Mypy nhập. Kiểm tra việc bạn sử dụng 40 07Dấu chấm lửng 43 là một phần của tệp và phải được viết chính xác như trên. Tệp sơ khai chỉ nên chứa các gợi ý kiểu cho các biến, thuộc tính, hàm và phương thức, do đó, phần triển khai nên được bỏ qua và thay thế bằng dấu đánh dấu 43Cuối cùng Mypy cũng có thể phát hiện ra lỗi mà chúng tôi đã giới thiệu 08Điều này trỏ thẳng đến dòng 16 và thực tế là chúng ta trả về một đối tượng 45 chứ không phải chuỗi tên. Sửa lại 29 thành 28 chạy Mypy lại thấy sướngđánh máyBạn đã biết cách sử dụng sơ khai để thêm gợi ý loại mà không thay đổi chính mã nguồn. Trong phần trước, chúng tôi đã thêm một số gợi ý loại vào gói Parse của bên thứ ba. Bây giờ, sẽ không hiệu quả lắm nếu mọi người cần tạo các tệp sơ khai của riêng họ cho tất cả các gói của bên thứ ba mà họ đang sử dụng Typeshed là kho lưu trữ Github chứa các gợi ý về kiểu cho thư viện chuẩn Python, cũng như nhiều gói của bên thứ ba. Đã đánh máy đi kèm với Mypy, vì vậy nếu bạn đang sử dụng gói đã có các gợi ý về loại được xác định trong Typeshed, thì việc kiểm tra kiểu sẽ chỉ hoạt động Bạn cũng có thể đóng góp các gợi ý về kiểu chữ cho Typeshed. Tuy nhiên, trước tiên hãy đảm bảo xin phép chủ sở hữu gói, đặc biệt là vì họ có thể đang làm việc để thêm gợi ý loại vào chính mã nguồn—đó là Trình kiểm tra loại tĩnh khácTrong hướng dẫn này, chúng tôi chủ yếu tập trung vào kiểm tra kiểu bằng Mypy. Tuy nhiên, có các trình kiểm tra kiểu tĩnh khác trong hệ sinh thái Python Trình chỉnh sửa đi kèm với trình kiểm tra loại riêng đi kèm. Nếu bạn đang sử dụng PyCharm để viết mã Python của mình, nó sẽ tự động được kiểm tra loại Facebook đã phát triển Pyre. Một trong những mục tiêu đã nêu của nó là nhanh chóng và hiệu quả. Mặc dù có một số khác biệt, các chức năng của Pyre hầu như tương tự như Mypy. Xem tài liệu nếu bạn muốn dùng thử Pyre Hơn nữa, Google đã tạo Pytype. Trình kiểm tra loại này cũng hoạt động gần giống như Mypy. Ngoài việc kiểm tra mã được chú thích, Pytype còn có một số hỗ trợ để chạy kiểm tra loại trên mã không được chú thích và thậm chí tự động thêm chú thích vào mã. Xem tài liệu bắt đầu nhanh để biết thêm thông tin Sử dụng các loại trong thời gian chạyLưu ý cuối cùng, bạn cũng có thể sử dụng các gợi ý loại trong thời gian chạy trong quá trình thực thi chương trình Python của mình. Kiểm tra loại thời gian chạy có thể sẽ không bao giờ được hỗ trợ nguyên bản trong Python Tuy nhiên, gợi ý loại có sẵn trong thời gian chạy trong từ điển 10 và bạn có thể sử dụng chúng để thực hiện kiểm tra loại nếu muốn. Trước khi bạn chạy và viết gói của riêng mình để thực thi các loại, bạn nên biết rằng đã có một số gói làm việc này cho bạn. Hãy xem Enforce, Pydantic hoặc Pytypes để biết một số ví dụMột cách sử dụng khác của gợi ý loại là để dịch mã Python của bạn sang C và biên dịch nó để tối ưu hóa. Dự án Cython phổ biến sử dụng ngôn ngữ C/Python lai để viết mã Python được nhập tĩnh. Tuy nhiên, kể từ phiên bản 0. 27 Cython cũng đã hỗ trợ các chú thích kiểu. Gần đây, dự án Mypyc đã có sẵn. Mặc dù chưa sẵn sàng để sử dụng chung, nhưng nó có thể biên dịch một số loại mã Python được chú thích thành các tiện ích mở rộng C Phần kết luậnGõ gợi ý trong Python là một tính năng rất hữu ích mà bạn có thể vui vẻ sống mà không cần. Gợi ý nhập không giúp bạn có khả năng viết bất kỳ mã nào mà bạn không thể viết nếu không sử dụng gợi ý nhập. Thay vào đó, sử dụng các gợi ý kiểu giúp bạn dễ dàng suy luận về mã hơn, tìm ra các lỗi tinh vi và duy trì một kiến trúc rõ ràng Trong hướng dẫn này, bạn đã học cách gợi ý kiểu hoạt động trong Python và cách gõ dần dần giúp kiểm tra kiểu trong Python linh hoạt hơn so với nhiều ngôn ngữ khác. Bạn đã thấy một số ưu và nhược điểm của việc sử dụng gợi ý kiểu và cách chúng có thể được thêm vào mã bằng cách sử dụng chú thích hoặc chú thích kiểu. Cuối cùng, bạn đã thấy nhiều kiểu khác nhau mà Python hỗ trợ, cũng như cách thực hiện kiểm tra kiểu tĩnh Có nhiều tài nguyên để tìm hiểu thêm về kiểm tra kiểu tĩnh trong Python. PEP 483 và PEP 484 cung cấp nhiều thông tin cơ bản về cách triển khai kiểm tra kiểu trong Python. Tài liệu Mypy có phần tham khảo tuyệt vời nêu chi tiết tất cả các loại khác nhau có sẵn Đánh dấu là đã hoàn thành Xem ngay Hướng dẫn này có một khóa học video liên quan do nhóm Real Python tạo. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn. Kiểm tra loại Python 🐍 Thủ thuật Python 💌 Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python Gửi cho tôi thủ thuật Python » Giới thiệu về Geir Arne Hjelle Geir Arne là một Pythonista cuồng nhiệt và là thành viên của nhóm hướng dẫn Real Python » Thông tin thêm về Geir ArneMỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là Aldren Brad Joanna Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia Nâng cao kỹ năng Python của bạn » Chuyên gia Kỹ năng Python trong thế giới thực Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia Nâng cao kỹ năng Python của bạn » Bạn nghĩ sao? Đánh giá bài viết này Tweet Chia sẻ Chia sẻ EmailBài học số 1 hoặc điều yêu thích mà bạn đã học được là gì? Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi Các kiểu con của chuỗi là gì?Các kiểu dữ liệu chuỗi là CHAR , VARCHAR , BINARY , VARBINARY , BLOB , TEXT , ENUM và SET .
Cấu trúc bên trong của chuỗi Python là gì?Chuỗi Python là tập hợp các ký tự được bao quanh bởi dấu nháy đơn, nháy kép hoặc nháy ba. Máy tính không hiểu các ký tự; . Mỗi ký tự được mã hóa theo ký tự ASCII hoặc Unicode. it stores manipulated character as the combination of the 0's and 1's. Each character is encoded in the ASCII or Unicode character.
Kiểu dữ liệu chuỗi trong Python lớp 11 là gì?Kiểu dữ liệu Chuỗi trong python cho phép bạn giữ bất kỳ ký tự hợp lệ nào (số chẵn) vào một tập hợp dấu ngoặc kép . e. g. 'aim1', “abc123”
Có bao nhiêu loại chuỗi trong Python?Trả lời. Python hỗ trợ hai loại chuỗi — Chuỗi một dòng và Chuỗi nhiều dòng. Chuỗi một dòng được đặt trong dấu ngoặc đơn hoặc dấu ngoặc kép và kết thúc bằng một dòng. Chuỗi nhiều dòng lưu trữ nhiều dòng văn bản và được đặt trong ba dấu ngoặc kép. |