Gõ python có thể gọi được là gì?
Vấn đề chính với gợi ý loại có thể gọi được là chúng có thể gây hiểu lầm. Ví dụ: đoạn mã sau sử dụng gợi ý loại có thể gọi được để chỉ ra rằng hàm f() phải được coi là hàm nhận một đối số Show
chắc chắn f(x) print(“Trong f() x là {}”. định dạng(x)) Tuy nhiên, đoạn mã này thực sự định nghĩa một hàm nhận hai đối số. Nếu bạn cố chạy mã này, bạn sẽ nhận được thông báo lỗi như thế này Trong f() x không được xác định Thông báo lỗi này là do Python không biết cách diễn giải gợi ý kiểu có thể gọi được trong ngữ cảnh này. Nói chung, các gợi ý kiểu có thể gọi được chỉ hữu ích nếu bạn thực sự đang xác định một hàm nhận một hoặc nhiều đối số def foo(x: callable[[int], int]) -> int: return x(3) #In this example, the foo function takes an argument x that must be a callable object, #and returns an int. The callable object must take an int as its first argument #and return an int. #Khi hàm foo được gọi, nó sẽ gọi hàm x với đối số đầu tiên là 3. nội dung
Nhập gợi ýGợi ý kiểu là một tính năng của ngôn ngữ lập trình Python cho phép bạn chỉ ra cho trình biên dịch biết loại biến hoặc hàm mà bạn đang đề cập đến 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 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 Xin chào các loại và Ưu và nhược điểm sẽ cho bạn biết cách hoạt động của kiểm tra loại 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 giá trị 12 vì bạn không thể thêm 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 ra 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
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 giá trị. Nó không bao giờ có thể được gán một giá trị không phải là đối tượng 16. Chẳng hạn, nếu sau này bạn nói 19, 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 là một ngôn ngữ được gõ động. 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ó những công cụ khác mà bạn sẽ thấy sau, 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 xuất phát 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 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 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>>> 7Lưu ý rằng cuộc gọi đến _____120 cho giá trị trả về của phương thức _______121. Trên thực tế, việc triển khai 20 về cơ bản tương đương như sau 1Để 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ư ________ 128, ________ 129, ________ 130 hoặc ________ 131Kiể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 thêm về cách gõ vịt 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í 9Theo 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 bao quanh là 34>>> 3Đã đế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 4Cú 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, PEP 8 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 sai loại đối số (được thừa nhận là có tên xấu) 32, thì mã vẫn chạy mà không có bất kỳ sự cố hoặc cảnh báo nào>>> 9Ghi chú. Lý do điều này có vẻ hiệu quả là chuỗi 49 được so sánh là trung thực. Sử dụng 50 sẽ không có tác dụng như 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ó sau này 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 4Đặ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 Sau này, 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 khởi động nhanh hơn. 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 tỷ lệ 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ự. 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 ra chính xác các loại của 97 tích hợp, cũng như các biến cục bộ của chúng tôi là 98 và 99Ghi 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 được 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. Biểu thức 95 có sẵn trong Mypy phiên bản 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 ý kiểu 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 10 cấp mô-đun>>> 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 70Cá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>>> 71Một nhận xét loại phải bắt đầu bằng chữ 15 và nằm trên cùng một 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 72Bạ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ó 73Chạy ví dụ thông qua Python và Mypy 74Nếu bạn gặp lỗi, 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 75Bạ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ố 76Trong 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 về việc thêm các loại vào thư viện của bên thứ ba 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 thời gian ngắn đi vào một số lý thuyết về loại, bạn sẽ thấy nhiều cách hơn nữa để chỉ định các loại trong Python. 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) 77Mỗ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 cỗ bài thông thường gồm 52 quân bài và tùy chọn xáo trộn các quân 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 78Bạ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à bộ dữ liệu đượ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 đó>>> 79Với các loại hỗn hợp, bạn được phép làm tương tự >>> 10Tuy 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>>> 11Lư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 hỗn 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 12Ngoà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 một 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 trình tự và không thực sự quan tâm đó là danh sách hay bộ dữ liệu. In these cases you should use 54 when annotating the function argument 13Sử dụng 55 là một ví dụ về cách sử dụng kiểu gõ vịt. 55 là bất kỳ thứ gì hỗ trợ 20 và 58, độc lập với loại thực tế của nóLoại bỏ các quảng cáoNhập bí danhThe type hints might become quite oblique when working with nested types like the deck of cards. Bạn có thể cần phải nhìn chằm chằm vào 48 một chút trước khi nhận ra rằng nó khớp với biểu tượng của chúng ta về một cỗ bàiNow consider how you would annotate 23 14That’s just terrible Recall that type annotations are regular Python expressions. That means that you can define your own type aliases by assigning them to new variables. Ví dụ, bạn có thể tạo bí danh loại 61 và 62 15 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 16Bí 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 >>> 17Lưu ý rằng khi in 62, nó hiển thị rằng đó là bí danh cho danh sách 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>>> 18Mặ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 gợi ý loại bằng cách sử dụng 67 cũng như loại trả về 19Cá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 90Lư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ề 91Trong 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 92Trong 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 69 93Vì 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 quay lại ví dụ về trò chơi bài của 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. 94Lư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 95Trong 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 96Đ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 97Mặ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 72 do sử dụng loại 79 98Bạn sẽ sớm thấy một cách tốt hơn. Tuy nhiên, trước tiên, chúng ta hãy có một cái nhìn lý thuyết hơn về hệ thống kiểu Python và vai trò đặc biệt của 79Loạ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 chuyển sang phần tiếp theo 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 con 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Để có 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à 702 và 703>>> 99Vì 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 30Các kiểu con có phần nào liên quan đến các lớp con. Trên 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 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. Chẳng hạn, 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à InvariantWhat happens when you use subtypes inside composite types? For instance, is 714 a subtype of 715? The answer depends on the composite type, and whether that type is covariant, contravariant, or invariant. Đ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ánEarlier we mentioned that Python supports gradual typing, where you can gradually add type hints to your Python code. Gradual typing is essentially made possible by the 79 typeSomehow 79 sits both at the top and at the bottom of the type hierarchy of subtypes. Any type behaves as if it is a subtype of 79, and 79 behaves as if it is a subtype of any other type. Looking at the definition of subtypes above this is not really possible. Instead we talk about consistent typesLoạ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 87 hoặc 88 là 79The type checker only complains about inconsistent types. The takeaway is therefore that you will never see type errors arising from the 79 typeThis means that you can use 79 to explicitly fall back to dynamic typing, describe types that are too complex to describe in the Python type system, or describe items in composite types. For instance, a dictionary with string keys that can take any type as its values can be annotated 750Do remember, though, if you use 79 the static type checker will effectively not do any type any checkingPlaying With Python Types, Part 2Let’s return to our practical examples. Recall that you were trying to annotate the general 72 function 96The problem with using 79 is that you are needlessly losing type information. You know that if you pass a list of strings to 72, it will return a string. Below you’ll see how to express this using type variables, as well as how to work with
Type VariablesA type variable is a special variable that can take on any type, depending on the situation Let’s create a type variable that will effectively encapsulate the behavior of 72 32A type variable must be defined using 757 from the 62 module. When used, a type variable ranges over all possible types and takes the most specific type possible. In the example, 759 is now a 28 33Consider a few other examples 34The first two examples should have type 28 and 35, but what about the last two? The individual list items have different types, and in that case the 763 type variable does its best to accommodate 35As you’ve already seen 39 is a subtype of 35, which again is a subtype of 07. So in the third example the return value of 72 is guaranteed to be something that can be thought of as a 07. In the last example, there is no subtype relationship between 28 and 35, so the best that can be said about the return value is that it is an objectNote that none of these examples raised a type error. Is there a way to tell the type checker that 72 should accept both strings and numbers, but not both at the same time?You can constrain type variables by listing the acceptable types 36Now 763 can only be either 28 or 07, and Mypy will note that the last example is an error 37Also note that in the second example the type is considered 07 even though the input list only contains 35 objects. This is because 763 was restricted to strings and floats and 35 is a subtype of 07In our card game we want to restrict 72 to be used for 28 and 61 38We briefly mentioned that 55 represents both lists and tuples. 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áoDuck Types and ProtocolsRecall the following example from the introduction 1 20 can return the length of any object that has implemented the 21 method. How can we add type hints to 20, and in particular the 26 argument?The answer hides behind the academic sounding term structural subtyping. One way to categorize type systems is by whether they are nominal or structural
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 796 protocol. We can therefore annotate 20 as follows 40Other examples of protocols defined in the 62 module include 799, 100, 101, and 102You can also define your own protocols. This is done by inheriting from 103 and defining the function signatures (with empty function bodies) that the protocol expects. The following example shows how 20 and 793 could have been implemented 41At the time of writing the support for self-defined protocols is still experimental and only available through the 106 module. This module must be explicitly installed from PyPI by doing 107The >>> if False: .. 1 + "two" # This line never runs, so no TypeError is raised .. else: .. 1 + 2 ... 3 >>> 1 + "two" # Now this is type checked, and a TypeError is raised TypeError: unsupported operand type(s) for +: 'int' and 'str' 108 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 112 saying that if no start player is given it should be chosen randomly 42The challenge this creates for type hinting is that in general 112 should be a string. However, it may also take the special non-string value 67In order to annotate such arguments you can use the 108 type 43The 108 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 118 type. 119Lưu ý rằng khi sử dụng 108 hoặc 118, bạn phải lưu ý rằng biến có đúng loại khi bạn thao tác trên biến đó. This is done in the example by testing whether 122. Not doing so would cause both static type errors as well as possible runtime errors 44Mypy tells you that you have not taken care of the case where 112 is 67 45Note. Việc sử dụng 67 cho các đối số tùy chọn phổ biến đến mức Mypy tự động xử lý nó. Mypy giả định rằng một đối số mặc định của 67 biểu thị một đối số tùy chọn ngay cả khi gợi ý loại không nói rõ ràng như vậy. You could have used the following 46Nếu bạn không muốn Mypy đưa ra giả định này, bạn có thể tắt nó bằng tùy chọn dòng lệnh 127Loại bỏ các quảng cáoVí dụ. Mục tiêu) của trò chơiHãy viết lại trò chơi bài để hướng đối tượng hơn. Điều này sẽ cho phép chúng ta thảo luận về cách chú thích đúng các lớp và phương thức Một bản dịch ít nhiều trực tiếp trò chơi bài của chúng tôi thành mã sử dụng các lớp cho 61, 62, 130 và 131 trông giống như sau 47Bây giờ hãy thêm các loại vào mã này Nhập gợi ý cho phương phápTrước hết, các gợi ý kiểu cho các phương thức hoạt động giống như các gợi ý kiểu cho các hàm. Sự khác biệt duy nhất là đối số 132 không cần chú thích, vì nó sẽ luôn là một thể hiện của lớp. Các loại của lớp 61 rất dễ thêm 48Lưu ý rằng phương thức 134 luôn phải có 67 làm kiểu trả về của nóCác lớp dưới dạng các loạiCó sự tương ứng giữa các lớp và các loại. Ví dụ: tất cả các thể hiện của lớp 61 cùng nhau tạo thành loại 61. Để sử dụng các lớp làm kiểu, bạn chỉ cần sử dụng tên của lớpVí dụ: một 62 về cơ bản bao gồm một danh sách các đối tượng 61. Bạn có thể chú thích điều này như sau 49Mypy có thể kết nối việc bạn sử dụng 61 trong chú thích với định nghĩa của lớp 61Điều này không hoạt động rõ ràng mặc dù khi bạn cần tham khảo lớp hiện đang được xác định. Ví dụ, phương thức của lớp 142 trả về một đối tượng có kiểu 62. Tuy nhiên, bạn không thể chỉ cần thêm 144 vì lớp 62 chưa được xác định đầy đủThay vào đó, bạn được phép sử dụng chuỗi ký tự trong chú thích. Các chuỗi này sẽ chỉ được đánh giá bởi trình kiểm tra loại sau này và do đó có thể chứa các tham chiếu tự và chuyển tiếp. Phương thức 146 nên sử dụng các chuỗi ký tự như vậy cho các loại của nó 90Lưu ý rằng lớp 130 cũng sẽ tham chiếu đến lớp 62. Tuy nhiên, điều này không có vấn đề gì, vì 62 được xác định trước 130 91Thông thường chú thích không được sử dụng trong thời gian chạy. Điều này đã chắp cánh cho ý tưởng trì hoãn việc đánh giá các chú thích. Thay vì đánh giá các chú thích dưới dạng biểu thức Python và lưu trữ giá trị của chúng, đề xuất là lưu trữ biểu diễn chuỗi của chú thích và chỉ đánh giá nó khi cần 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. Tuy nhiên, trong Python 3. 7 trở lên, các tham chiếu chuyển tiếp có sẵn thông qua quá trình nhập 151 92Với việc nhập 151, bạn có thể sử dụng 62 thay vì 154 ngay cả trước khi 62 được xác địnhTrả lại >>> if False: .. 1 + "two" # This line never runs, so no TypeError is raised .. else: .. 1 + 2 ... 3 >>> 1 + "two" # Now this is type checked, and a TypeError is raised TypeError: unsupported operand type(s) for +: 'int' and 'str' 132 hoặc >>> if False: .. 1 + "two" # This line never runs, so no TypeError is raised .. else: .. 1 + 2 ... 3 >>> 1 + "two" # Now this is type checked, and a TypeError is raised TypeError: unsupported operand type(s) for +: 'int' and 'str' 157Như đã lưu ý, thông thường bạn không nên chú thích các đối số 132 hoặc 157. Một phần, điều này là không cần thiết vì 132 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, 132 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ự, 164Tuy nhiên, có một trường hợp bạn có thể muốn chú thích 132 hoặc 157. 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ề 132 hoặc 157 93Trong khi mã chạy không có vấn đề, Mypy sẽ đánh dấu sự cố 94Vấn đề là mặc dù các phương thức kế thừa 169 và 170 sẽ trả về một 171 nhưng chú thích nói rằng chúng trả về một 172In cases like this you want to be more careful to make sure the annotation is correct. The return type should match the type of 132 or the instance type of 157. This can be done using type variables that keep track of what is actually passed to 132 and 157 95There are a few things to note in this example
Annotating >>> if False: .. 1 + "two" # This line never runs, so no TypeError is raised .. else: .. 1 + 2 ... 3 >>> 1 + "two" # Now this is type checked, and a TypeError is raised TypeError: unsupported operand type(s) for +: 'int' and 'str' 186 and >>> if False: .. 1 + "two" # This line never runs, so no TypeError is raised .. else: .. 1 + 2 ... 3 >>> 1 + "two" # Now this is type checked, and a TypeError is raised TypeError: unsupported operand type(s) for +: 'int' and 'str' 187In the object oriented version of the game, we added the option to name the players on the command line. This is done by listing player names after the name of the program 96This is implemented by unpacking and passing in 188 to 189 when it’s instantiated. The 134 method uses 191 to pack the given names into a tupleRegarding type annotations. even though 38 will be a tuple of strings, you should only annotate the type of each name. In other words, you should use 28 and not 194 97Similarly, if you have a function or method accepting 187, then you should only annotate the type of each possible keyword argumentCallablesFunctions are first-class objects in Python. This means that you can use functions as arguments to other functions. That also means that you need to be able to add type hints representing functions Functions, as well as lambdas, methods and classes, are represented by 196. The types of the arguments and the return value are usually also represented. For instance, 197 represents a function with three arguments with types 198, 199, and 900, respectively. The return type of the function is 901In the following example, the function 902 calls a given function twice and prints the return values 98Note the annotation of the 903 argument to 902 on line 5. It says that 903 should be a callable with one string argument, that also returns a string. One example of such a callable is 906 defined on line 9Most callable types can be annotated in a similar manner. However, if you need more flexibility, check out callback protocols and extended callable types Example. HeartsLet’s end with a full example of the game of Hearts. You might already know this game from other computer simulations. Here is a quick recap of the rules
More details can be found found online There are not many new typing concepts in this example that you have not already seen. We’ll therefore not go through this code in detail, but leave it as an example of annotated code Source Code for the Hearts Card GameShow/Hide You can download this code and other examples from GitHub 99Dướ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 40Kiể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 4Vớ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 42Chạy Mypy trên tệp Python 914 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 43Ngoài ra, tài liệu dòng lệnh Mypy trực tuyến 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 ý về loại, bạn có thể muốn tắt 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 915Ví dụ sau sử dụng Numpy để tính và in cosin của một số số 44Lưu ý rằng 916 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 45Đầ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ố 917 được chú thích bằng 918 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 46Nhữ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ề sơ khai và đánh máy. 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 47Nếu bạn sử dụng tùy chọn dòng lệnh 919, Mypy sẽ không cố theo dõi hoặc cảnh báo về bất kỳ lần nhập nào bị thiếu. 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 cảnh báo 920 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 48 921 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à 922 trong thư mục hiện tại nếu nó có mặt. Tệp cấu hình này phải chứa một phần có tên là 923 và có thể chứa các phần cụ thể của mô-đun có dạng 924Tệp cấu hình sau sẽ bỏ qua gợi ý loại Numpy bị thiếu 49Có 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 925 đượ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 926, nhưng chương trình chỉ ra rằng 927 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ừ 928 thành 929. Điều này sẽ trả về một đối tượng 930 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 925. 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 932 để trỏ đến thư mục này. Trên Mac và Linux, bạn có thể đặt 932 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 934 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 932Tiế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à 936. 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ố 937. Để 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 936 mới để tìm ra chức năng nào có sẵn trong gói 925. Vì tệp sơ khai trống, Mypy giả định rằng 940 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 925. Thay vào đó, nó hiển thị gợi ý loại bạn cần thêm để Mypy nhập kiểm tra việc bạn sử dụng 940 07Dấu chấm lửng 943 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 đó, việc triển khai nên được bỏ qua và thay thế bằng dấu 943Cuố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 tôi trả về một đối tượng 945 chứ không phải chuỗi tên. Đổi lại 929 thành 928, chạy lại Mypy 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—đây là cách tiếp cận ưa thích 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 PyCharm đ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 để 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 » Bậc thầy 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 các chuyên gia Pythonistas 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. Nhận các mẹo để đặt câu hỏi hay 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 Gõ nghĩa là gì trong Python?Python vừa là ngôn ngữ được gõ mạnh vừa là ngôn ngữ được gõ động. Nhập mạnh có nghĩa là các biến có một loại và loại đó quan trọng khi thực hiện các thao tác trên một biến . Nhập động có nghĩa là loại biến chỉ được xác định trong thời gian chạy.
Loại nào có thể gọi được?Loại có thể gọi là loại mà thao tác IVOKE (được sử dụng bởi, e. g. , tiêu chuẩn. chức năng, tiêu chuẩn. ràng buộc, và tiêu chuẩn. chủ đề. chủ đề) được áp dụng . Thao tác IVOKE có thể được thực hiện rõ ràng bằng cách sử dụng hàm thư viện std. gọi.
Mục đích của hàm type() là gì?Hàm type() được sử dụng để lấy loại đối tượng . Khi một đối số duy nhất được chuyển đến hàm type(), nó sẽ trả về kiểu của đối tượng. Giá trị của nó giống như đối tượng. __class__ biến thể hiện.
Python xử lý việc gõ như thế nào?Python sẽ luôn là ngôn ngữ được nhập động . 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. |