Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Tôi muốn bắt đầu với một bài kiểm tra pop: Python có được gõ động hoặc thống kê không?

Có thể bạn nghĩ rằng nó được gõ linh hoạt. Có thể bạn nghĩ, hmm, đây là một cuộc nói chuyện về 'gõ tĩnh trong python', vì vậy nó có thể được gõ một cách thống kê?

Hoặc có thể bạn nghĩ rằng đây là một câu hỏi lừa?

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Vâng, đó là một câu hỏi lừa.

Câu trả lời là Python được gõ linh hoạt, nhưng nó có thể tùy chọn được gõ một cách thống kê như bạn muốn.

Và nếu điều đó không có ý nghĩa gì với bạn, điều đó không sao, bạn đang nói chuyện đúng đắn và chúng tôi sẽ phá vỡ mọi thứ cần thiết để hiểu câu trả lời đó.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Để hiểu điều đó, chúng ta cần hiểu các loại trong Python và các hệ thống loại nói chung.

Chúng ta sẽ nói về việc gõ năng động trong Python, sau đó chúng ta sẽ nói về việc gõ tĩnh trong Python.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Khi chúng tôi hiểu điều đó, chúng tôi sẽ nói về cách sử dụng gõ tĩnh trong Python, khi bạn nên sử dụng nó và khi bạn có thể không nên sử dụng nó.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Hãy nói về các loại và cụ thể hãy nói về type, từ khóa tích hợp trong Python.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Trong Python, trong sự thay đổi của chúng tôi, chúng tôi có thể gõ một cái gì đó như thế này: type(42) và chúng tôi lấy lại một cái gì đó nói rằng đó là của lớp int. Vì bốn mươi hai là một số nguyên, điều này có ý nghĩa.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Chúng ta có thể làm điều tương tự cho những chiếc phao ...

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

...dây...

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

... Danh sách, v.v.

type tích hợp cho chúng ta biết đối tượng đã cho loại A nào.

Bạn có thể nói, "Ồ, tôi nhận ra những điều này, str, int, float, đây là những gì tôi sử dụng để thay đổi loại này sang loại khác."

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Và vâng, bạn có thể có một biến như thế này, ____ 7 ...

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

... bạn gọi float() trên đó và bạn có một chiếc phao ...

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

... bạn gọi str() trên đó và bạn nhận được một chuỗi ...

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

... và bạn có thể gọi type(42)0 trên đó và bạn có được một danh sách thực sự xấu xí.

Ai đã thấy một danh sách thực sự xấu xí như thế này trước đây, nơi một chuỗi đang được biến thành một danh sách? Đó là một lỗi loại!

Bạn đã gặp lỗi loại trong mã của mình, trong đó một cái gì đó đang mong đợi một sự khác biệt, như một danh sách và có một chuỗi thay thế và Python đã làm điều này.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Điều cần lưu ý ở đây là những thứ như int trông giống như tất cả các loại có sẵn cho chúng tôi, nhưng chúng chỉ là các lớp tương ứng với tích hợp.

Ở đây int chỉ là một từ khóa tương ứng với một lớp. Khi bạn làm type(42)3, đó chỉ là kết hợp lớp học và đang cho bạn biết liệu đó có phải là thành viên của lớp đó hay không.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Nhưng cũng có những loại khác, phải không? Có lẽ bạn đã gặp lỗi type(42)4. type(42)4 là loại type(42)6, nhưng chúng ta không xem type(42)4 là một từ khóa trong Python, chúng ta chỉ thấy nó trong dấu vết ngăn xếp của chúng ta.

Tương tự, có một loại type(42)8, nhưng chúng tôi không sử dụng từ khóa type(42)8 để xác định hàm trong Python, chúng tôi nói int0, v.v.

Ngoài ra còn có một loại int1, và thực sự, có rất nhiều.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Trong Python nếu bạn ________ 22 ...

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

... Và bạn gọi int3 vào int4, có toàn bộ danh sách những thứ tồn tại trong Python có thể có một loại, như int5, bạn có thể thấy int6 đang ở trong đó, có tất cả các loại.

Bạn có thể khởi tạo một chức năng với các lớp này, đó chỉ là một lớp có các đối số. Nhưng chúng tôi không, bởi vì nó thực sự lộn xộn, nhưng những loại này có sẵn.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Khi chúng ta nói rằng Python là một ngôn ngữ được đánh máy động, nó có nghĩa là gì?

Trước hết, nó có nghĩa là một biến có thể là bất kỳ loại nào. Nếu tôi gán một cái gì đó là một biến, nó có thể chứa bất kỳ loại nào có sẵn cho chúng tôi.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Ví dụ: tôi có thể int7 và đặt biến int8 thành lựa chọn ngẫu nhiên giữa một số nguyên, phao và một chuỗi.

Loại int8 ở đây nếu tôi đánh giá điều này là gì?

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Vâng, nó phụ thuộc, nó không xác định. Nó phụ thuộc vào đối tượng nào được chọn ngẫu nhiên từ danh sách đó.

Có thể là một chuỗi, có thể là int, có thể nổi, không quan trọng. Biến đó có thể chứa bất kỳ loại nào trong số đó.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Gõ động cũng có nghĩa là các đối số và giá trị trả về cho một hàm cũng có thể là bất kỳ loại nào như tất cả. Điều tương tự cũng đúng với một biến vì nó là đối với các đối số chức năng vì nó dành cho giá trị trả về cho hàm.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Nếu tôi có một chức năng như thế này, type0 có ba đối số và trả lại type1, làm thế nào để chúng ta biết những loại này sẽ mong đợi? Có ai đoán được những gì int8, type3 và type4 nên ở đây không?

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Nếu tôi xác định hàm type0 và tôi gọi nó với 1, 2 và 3, nó sẽ thêm tất cả chúng lên đến 6.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Nhưng, tôi cũng có thể gọi chức năng này với các chuỗi. Và nó sẽ kết hợp các chuỗi này thay thế.

Hàm này sẽ chấp nhận một trong hai loại này là đối số và nó vẫn hoạt động, phải không? Nó vẫn là một chức năng Python hợp lệ.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Những gì tôi không thể làm là trộn các loại này, tôi không thể thêm số nguyên và chuỗi chỉ với toán tử type6, vì vậy điều này sẽ dẫn đến type7: Tôi đang cố gắng làm điều gì đó và các loại không tương thích.

Thật khó hiểu, chức năng này thật khó hiểu. Làm thế nào chúng ta có thể sửa chữa nó?

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Một điều chúng tôi có thể làm là viết các tài liệu thực sự dài và chi tiết phác thảo mọi loại mà chức năng mong đợi, chúng là gì và nó trả về những gì.

Ai viết tài liệu như thế này, có ai không? Đối với những người bạn có tay lên, chủ nhân của bạn có trả tiền cho bạn đủ để viết các tài liệu như thế này không?

Bởi vì nó là rất nhiều công việc! Và trong khi điều này là tuyệt vời để đọc, điều về điều này là việc viết DocString này không ảnh hưởng đến việc chức năng này có thực sự được gọi là chính xác hay không.

Bạn đang nói với nhà phát triển rằng cuối cùng sẽ đến và thử và sử dụng nó, rằng đây là những gì bạn mong đợi, nhưng không có gì đảm bảo rằng họ thực sự sẽ làm điều đó.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Một điều khác chúng tôi có thể làm: Chúng tôi có thể type8 về loại mọi thứ được truyền cho chức năng này, thực hiện logic kinh doanh của chúng tôi và sau đó khẳng định loại trả lại trước khi chúng tôi thực sự trả lại.

Tôi đã nói chuyện này một lần trước đây và tôi đã nói "Không ai làm, đây, điều này thật điên rồ!" Bởi vì điều đó là, điều này thực sự làm tăng thêm chi phí cho việc thực hiện chức năng này. Có một chi phí nhỏ bạn phải trả để thực hiện tất cả những khẳng định này.

Và sau khi tôi nói chuyện này, ai đó đã đến gặp tôi và nói "Vâng, thực sự, chúng tôi làm điều này ..." và trong khi nó hoạt động - đó là một cách hợp lệ để khẳng định các loại cho chức năng của bạn - đó là rất nhiều Các dòng bổ sung, và nếu bạn quên một khẳng định thì sao? Bạn phải nhớ điều đó.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Thay vào đó chúng ta làm gì? Trong Python, những gì chúng tôi làm được gọi là "Gõ vịt"

Điều đó có nghĩa là nếu nó đi bộ như một con vịt, và nó quack như một con vịt, nó có lẽ là một con vịt.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Điều này có nghĩa là cách chúng tôi sử dụng một biến giúp chúng tôi xác định loại có thể là gì.

Ví dụ: trong dòng đầu tiên này, tôi đang đặt type9 là str0. Chúng tôi có thể có thể giả định một cách hợp lý rằng str1 là một thứ có thể đi được, có thể là một chuỗi, một danh sách hoặc một bộ.

Trên dòng thứ hai, chúng tôi so sánh str1 với số 0, vì vậy str1 có lẽ là một số, như một số nguyên hoặc một chiếc phao. Không rõ, nhưng chúng tôi có một ý tưởng khá tốt về nó là gì.

Và cái cuối cùng, đó có thể là một chức năng, nó có thể là một lớp được đặt tên kém (không bắt đầu bằng chữ viết hoa), nhưng chúng tôi không biết. Nó có thể là bất cứ điều gì.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Điều này đưa chúng ta đến việc gõ tĩnh. Gõ tĩnh về cơ bản là đối diện với gõ động. Điều đó có nghĩa là loại biến, các đối số cho một hàm và loại trả về của một hàm được xác định tĩnh và chúng không thể thay đổi, chúng phải là một điều cụ thể.

Dưới đây là một số ví dụ về cùng chức năng type0 trong các ngôn ngữ khác và tôi tò mò liệu mọi người có thể nhận ra các ngôn ngữ này hay không.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Đây là ví dụ đầu tiên, có ai biết không?

Đó là C.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Làm thế nào về cái này?

Đó là Java, đó là một món quà đã chết với str5.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Có ai biết cái này không?

Đây là Rust: Rust có các loại số nguyên hạt thực sự mịn, vì vậy đây là một số nguyên 8 bit không dấu.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Làm thế nào về cái này? str6 là gợi ý ở đây.

Đây là TypeScript, được đánh máy JavaScript. Trong JavaScript chỉ có một loại số, mọi thứ đều là str6, vì vậy đó là cách bạn biết.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Bạn có thể sắp xếp các ngôn ngữ đặt vào một trong hai loại: có các ngôn ngữ được gõ động và có các ngôn ngữ được đánh máy tĩnh.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Và tôi phải đặt một chút dấu hoa thị ở đây bên cạnh Python ở đây, đó là lý do tại sao chúng tôi có cuộc nói chuyện này. Bởi vì Python là, và ban đầu là một ngôn ngữ được đánh máy động, nhưng giờ đây nó cũng được đánh máy một cách thống kê.

Cũng rõ ràng Ruby sẽ có được một loại hệ thống giống như Python nhưng cho đến cuối năm tới, vì vậy tôi sẽ không bao gồm nó.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Giống như tôi đã nói trước đây: Python là một ngôn ngữ được đánh máy động, nhưng nó có thể tùy chọn được đánh máy tĩnh như bạn muốn.

Điều này không phải lúc nào cũng đúng. Khi Python lần đầu tiên được tạo ra, nó hoàn toàn là một ngôn ngữ được đánh máy động.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Và câu chuyện về Python trở thành một ngôn ngữ được đánh máy tùy ý cũng là câu chuyện về việc kiểm tra kiểu tại Dropbox.

Dropbox là một công ty lớn với hàng triệu dòng mã Python. Ở quy mô đó, có nhiều dòng mã chưa được tính là một trách nhiệm pháp lý. Nó trở nên khó khăn hơn theo cấp số nhân cho các nhà phát triển của bạn giải thích mã này làm gì khi họ kế thừa các cơ sở mã mới, khi họ đang thực hiện tái cấu trúc, v.v.

Khá sớm trong hành trình có nhiều mã Python đó, họ nhận ra rằng thật không tuyệt vời khi Python được gõ linh hoạt trong trường hợp này, bởi vì điều đó khiến chúng tôi khó làm việc với nó.

Tuy nhiên, có một số điều dẫn đến nó là tốt.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Đầu tiên là PEP 3107. Chúng tôi đã nhận được điều này trong Python 3.0 vào năm 2006, và điều này cho phép chúng tôi làm một cái gì đó như thế này.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Tôi có thể có một chức năng như thế này ...

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

... và tôi có thể thêm bất kỳ siêu dữ liệu nào mà tôi muốn vào các đối số và loại trả về của hàm này. Bất cứ điều gì là Python hợp lệ đều có thể được đưa vào sau khi đại tràng ở đây.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Và những gì tôi sẽ nhận được, nếu tôi xác định hàm đó và gọi str8 để lấy thuộc tính đó ra khỏi nó, sẽ là đánh giá của tất cả các chú thích đó, trong một str9, bao gồm cả chú thích trả lại. Bây giờ, đây chỉ là những thứ được tạo nên, chúng không có ý nghĩa thực sự.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Và đó là điều, về cơ bản nó là một tính năng tốt, và có rất nhiều điều có thể được thực hiện với nó.

Tất cả chúng đã sôi sục xuống "Có lẽ chúng ta có thể cung cấp thông tin gõ với điều này" và có rất nhiều cách khác nhau mà chúng ta có thể làm điều đó.

Chúng tôi cũng có thể chỉ sử dụng nó làm tài liệu, nhưng thực sự nó rất mong được có các chú thích loại cho các chức năng.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Điều này cho phép chúng tôi thực sự viết một chức năng như thế này thực sự thú vị. Ở đây, bạn có thể thấy loại cho mỗi đối số và loại trả về, và sau đó bạn sẽ có các chú thích sẽ cho bạn biết những gì nhà phát triển đang mong đợi khi họ viết mã đó.

Nhưng, nó vẫn không cho chúng ta một cách để thực sự đánh giá liệu chức năng đó có được sử dụng chính xác hay không, nó chỉ cho chúng ta chú thích và bây giờ là một thuộc tính cho chúng ta biết những chú thích đó là gì.

Và, đây chỉ là cho các chức năng: không thể thực hiện các biến ở đây.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Cũng trong khoảng thời gian đó, Jukka Lehtosalo đang làm việc với luận án tiến sĩ của mình tại Đại học Cambridge.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Nghiên cứu của ông là về sự thống nhất của các ngôn ngữ được đánh máy và đánh máy động.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Mục tiêu của anh ấy là có thể sử dụng cùng một ngôn ngữ cho mọi thứ, từ các kịch bản thực sự nhỏ bé, đến một cơ sở mã vạch nhiều triệu người rộng lớn và thêm bao nhiêu gõ như bạn muốn.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Anh ấy muốn có sự phát triển dần dần này từ một thứ hoàn toàn chưa được khai thác, và cho phép bạn từ từ trộn vào và thêm gõ tĩnh vào nó.

Nghe có vẻ thú vị. Sẽ là tuyệt vời nếu không phải làm tất cả cùng một lúc, đặc biệt nếu bạn có hàng triệu dòng.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Năm 2011, ông đã xuất bản luận án tiến sĩ, và về cơ bản kết luận của ông là:

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Nếu bạn cố gắng thêm một hệ thống loại tĩnh vào ngôn ngữ được đánh máy động, nó có thể hoàn toàn xâm lấn. Bạn sẽ phải thay đổi mọi công cụ trong hệ sinh thái, mọi thông dịch viên, mọi thứ kiểm tra cú pháp, v.v ... Đây là kết luận của anh ấy.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Tuy nhiên, ông đề xuất rằng, nếu bạn có thể tạo một hệ thống loại tùy chọn, có thể cắm được không thực sự ảnh hưởng đến thời gian chạy của chương trình, thì điều này có thể được thêm vào mọi thứ mà không cần thêm gánh nặng đáng kể vào hệ sinh thái.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Điều này nghe thực sự tuyệt vời. Những gì anh ấy đã làm là lấy công việc tiến sĩ của mình, và đến Pycon Us vào năm 2013, và anh ấy đã giới thiệu một thứ gọi là Mypy.

Nếu bạn đã nghe nói về Mypy trước đây, những gì anh ấy đã giới thiệu không phải là những gì bạn đã nghe trước đây.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Trong bản tóm tắt cho cuộc nói chuyện này, ông mô tả Mypy là "một biến thể thử nghiệm của Python hỗ trợ viết các chương trình kết hợp liền mạch sự gõ tĩnh và động".

Đây không phải là một trình kiểm tra loại (mặc dù nó bao gồm một trình kiểm tra loại), nó thực sự là một biến thể của Python.

Trong nghiên cứu của mình, anh ta không thể sử dụng Python trực tiếp, vì vậy anh ta đã tạo ra một ngôn ngữ mới trông giống như Python cho phép anh ta thực sự thực hiện nghiên cứu về các hệ thống loại.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Mypy ngôn ngữ trông như thế này. Nó trông giống như Python, nhưng bạn thấy rằng nó có int0, đó là định nghĩa loại chức năng đó, v.v.

Vấn đề là, Python vào thời điểm đó, ngay cả với các chú thích chức năng, anh ta không thực sự sử dụng Python để thực hiện nghiên cứu gõ tĩnh.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Anh ấy đã trình bày dự án của mình tại Pycon, và sau đó anh ấy nói, anh ấy đã trò chuyện với Guido về nó, và Guido đã thuyết phục anh ấy thoát khỏi biến thể Python này, chỉ cố gắng làm điều đó trong Python thuần túy, vì nó sẽ có ý nghĩa hơn rất nhiều và chúng tôi cũng sẽ nhận được một số lợi ích từ nó.

Vì vậy, biến thể đã biến mất, và Mypy trở thành người kiểm tra loại được bao gồm trong nó, và đó thực sự là những gì chúng ta nghĩ và những gì chúng ta sẽ thấy trở thành Mypy ngày hôm nay.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Ngay sau đó, Guido đã xuất bản PEP 483, đó là lý thuyết về gợi ý của ông: ý tưởng về cách các loại và gõ tĩnh nên hoạt động trong Python. Đây là một số ý tưởng thực sự rộng và chung về việc gõ vào Python nói chung.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Nguyên lý đầu tiên của điều này là việc đánh máy phải là tùy chọn, và bạn có thể thấy điều này đến từ nghiên cứu của Jukka. Về cơ bản: Thêm một chú thích vào một số mã Python sẽ không ảnh hưởng đến thời gian chạy. Nó sẽ có hiệu lực bằng không đối với thời gian chạy thực tế của chương trình của bạn.

Điều này có nghĩa là một hàm được chú thích nên hoạt động chính xác giống như một hàm không có bất kỳ chú thích loại nào.

Tôi nghĩ rằng đây là đại diện cho một số bài học mà chúng tôi đã học được từ quá trình chuyển đổi từ Python 2 sang Python 3: Chúng tôi muốn đây là một sự chuyển đổi dễ dàng từ mã không được đánh máy sang mã được đánh máy.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Và chúng tôi cũng muốn có thể làm điều đó từng phần: như Jukka đã nói trong bài báo của mình, chúng tôi muốn gõ dần dần, bạn muốn có thể gõ vào một số tệp nhất định trong cơ sở mã của bạn và không phải làm tất cả cùng một lúc.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Ngoài ra, chúng ta nên có chú thích thay đổi: chỉ là các hàm là không đủ, chúng ta cũng cần một cách để chỉ định các loại cho các biến riêng lẻ trong Python.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Điều đó có nghĩa là ngoài việc có chú thích chức năng ...

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

... Chúng ta sẽ có thể nói rằng loại biến này mà tôi gán cho là một số nguyên, và sau đó trả lại điều đó.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Điều này cũng có nghĩa là chúng ta có thể thực hiện gợi ý loại cho Python 2. Miễn là chúng ta có loại ký hiệu nhận xét này cho các biến, ngay cả những biến số có phiên bản Python cũ cũng có thể sử dụng gõ tĩnh. Điều này cho phép chúng tôi thực hiện tất cả các loại chú thích tương tự trước khi các chú thích chức năng tồn tại trong Python 3.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Điều đó có nghĩa là tôi có thể có cùng chức năng trong Python 2 và Python 3, và chỉ bằng cách biến chú thích chức năng đó thành một nhận xét, nó có cùng một hành vi.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

PEP này cũng giới thiệu một số cấu trúc loại đặc biệt, đây là một số điều cơ bản chúng ta cần gõ tĩnh.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Chúng lấy tất cả các loại hiện có và cho phép chúng tôi xây dựng các loại mới là tốt.

Đây là những loại như int1, phù hợp với loại bất cứ thứ gì, int2, đó là sự kết hợp của hai loại, int3, là bí danh cho sự kết hợp của type(42)4 và bất kỳ loại hiện có nào, int5, int6, v.v. khớp với các đối tượng tương ứng trong Python.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Sau đó, chúng ta có thể viết một cái gì đó như thế này: hàm type0 có số nguyên, số nguyên, và sau đó tùy ý có thể lấy int hoặc float, và sau đó giá trị trả về, một lần nữa, có thể là một int hoặc float.

Khi chúng ta có các cấu trúc loại đặc biệt này, chúng ta có một hệ thống loại mạnh hơn ở đây.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

PEP cũng xác định một số loại container, cho phép chúng tôi xác định các loại bên trong các lớp container như từ điển và danh sách.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Điều đó sẽ trông giống như thế này. Nếu tôi có một danh sách các số nguyên, tôi có thể xác định loại của lớp container đó và các giá trị sẽ được lưu trữ bên trong nó và tương tự cho từ điển: tôi có thể có một từ điển trong đó khóa chúng luôn là một chuỗi và giá trị luôn luôn là một số nguyên.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

PEP cũng cho chúng ta các loại chung, cho những thứ hoạt động theo cách chung.

Trong Python, chúng ta có những thứ giống như một điều đó. Một điều khác là toàn bộ các đối tượng này có các tính năng của một cái gì đó có thể được lặp lại.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Chúng tôi cũng có các loại như int8 mà chúng tôi có thể sử dụng để gõ những thứ mà chúng tôi không thực sự quan tâm nếu đó là danh sách, hoặc nếu đó là một điều kiện: chúng tôi chỉ muốn có thể lặp lại nó.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Cuối cùng, với lý thuyết về gợi ý loại này, chúng ta có thể thực hiện các bí danh loại bằng cách sử dụng int2.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Vì vậy, nếu chúng ta muốn giống JavaScript hơn, chúng ta có thể có một loại số duy nhất thống nhất tất cả các số trong Python.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Đó là lý thuyết về gợi ý loại, và sau đó chúng tôi có PEP 484, tiêu chuẩn hóa mọi thứ trong PEP 483, và về cơ bản là tiêu chuẩn hóa xung quanh những gì MyPy hiện đang làm.

Nói tóm lại, PEP này là "Làm thế nào để xây dựng một trình kiểm tra loại cho Python". Nó giới thiệu một mô -đun float0, nó giới thiệu rất nhiều chi tiết về các trường hợp cạnh và các trường hợp sử dụng cụ thể. Nó thực sự dựa rất nhiều vào những gì Mypy đã làm.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Chúng tôi đã nhận được điều đó trong Python 3.5, có hỗ trợ PEP 484, bao gồm cả mô -đun float0.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Sau đó, chúng tôi đã nhận được PEP 526, chúng tôi cho chúng tôi thực hiện các chú thích biến nội tuyến.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Điều này cho phép chúng tôi làm một cái gì đó như thế này: Trước, đối với các biến, chúng tôi đã phải sử dụng các nhận xét loại này ...

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

... và bây giờ chúng ta có thể làm điều đó nội tuyến. Vì vậy, float2 sẽ trông như thế này.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Một vấn đề với cú pháp chú thích nhận xét là thật khó để khởi tạo một loại cho một biến chưa có giá trị.

Với các chú thích biến nội tuyến, chúng ta có thể làm điều này, trong đó chỉ nói "biến này là một chuỗi, tôi không quan tâm, nó chưa có giá trị"

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Và điều tương tự cho các loại lớp. Ở đây, float3 là một biến lớp, bây giờ tôi có thể chú thích nó một cách chính xác với các chú thích nội tuyến.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Chúng tôi đã nhận được điều đó trong Python 3.6, và đó là hầu hết mọi thứ chúng tôi cần để gõ tĩnh trong Python, nhưng chúng tôi cần một trình kiểm tra loại.

Và đó là Mypy, và đó là phần cuối cùng của câu đố. Nó không được bao gồm trong Core Python, nó là một công cụ của bên thứ ba.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Ý tưởng là chúng tôi có một vài loại kiểm tra loại khác nhau: chúng tôi có trình kiểm tra loại động hoặc tĩnh.

Một trình kiểm tra loại tĩnh sẽ kiểm tra mã của bạn khi nghỉ ngơi. Nó sẽ xem xét nguồn của bạn và không thực sự đánh giá bất kỳ điều gì trong số đó, nó sẽ làm điều đó hoàn toàn tĩnh. Trong khi một trình kiểm tra loại động sẽ giống như những khẳng định mà chúng tôi đã làm trước đây: nó sẽ xảy ra vào thời gian chạy, nó sẽ kiểm tra các loại đó khi chương trình của bạn thực hiện.

Vì vậy, MyPy là một trình kiểm tra loại tĩnh cho python được gõ tĩnh.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Như tôi đã nói, nó chỉ là một công cụ, bạn có thể float4, nó có sẵn trên PYPI.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Nếu bạn chạy nó, nó trông giống như thế này: bạn cài đặt nó, tạo một tệp với một số loại tĩnh và nếu chúng sai, nó sẽ cảnh báo bạn. Nó sẽ cho bạn biết "Này, bạn đã nói với tôi đối số này sẽ là một số nguyên, nhưng bạn đang gọi nó bằng một chuỗi, đó là một lỗi loại.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Thực tế có một loạt các loại kiểm tra loại bên cạnh Mypy, như tôi đã nói, có những cái tĩnh và năng động. Các loại tĩnh phù hợp với tất cả các cửa hàng Python lớn tồn tại, vì vậy Mypy chủ yếu thuộc sở hữu của Dropbox ngày nay, Google có Pytype, Facebook có Pyre, Microsoft có pyright.

Pycharm thực sự có một trình kiểm tra loại được tích hợp vào IDE. Và thực sự bạn có thể sử dụng bất kỳ trình kiểm tra loại nào với bất kỳ môi trường IDE hoặc phát triển nào của bạn, hầu hết chúng tích hợp vào một số môi trường Python.

Tuyên bố miễn trừ trách nhiệm, tôi làm việc tại Google, vì vậy một trong những câu hỏi mà tôi thường nhận được về kiểm tra loại là "sự khác biệt là gì?" Giống như, nếu tất cả những điều này thực hiện PEP 484, sự khác biệt giữa chúng là gì. Tôi thực sự chỉ sử dụng mypy và pytype, vì vậy tôi sẽ cho bạn biết sự khác biệt giữa những điều đó là gì.

Câu trả lời không phải là rất nhiều, về cơ bản nó đi vào một triết lý.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Triết lý là pytype sẽ chỉ cho bạn một lỗi loại nếu nó thực sự sẽ trở thành một ngoại lệ thời gian chạy. Trong khi MyPy sẽ nghiêm ngặt hơn rất nhiều về việc sử dụng thực tế của các loại. Tôi sẽ chỉ cho bạn một số ví dụ.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Ở đây tôi có hai chức năng: một hàm trả về một chuỗi và chuỗi còn lại thực hiện cuộc gọi đến hàm đó và thêm nó vào một số nguyên.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Nếu tôi chạy điều này, đó sẽ là một lỗi loại: Tôi đang cố gắng thêm một chuỗi vào một số nguyên và đó là một vấn đề.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Nếu tôi chạy nó với Mypy, nó thực sự vượt qua. Nó nói rằng điều này là tốt, và lý do là vì nó không thể thực hiện suy luận loại trên nhiều chức năng.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Tuy nhiên, nếu tôi chạy điều này với pytype, nó thực sự sẽ nói "Vâng, nếu bạn chạy điều này, vào thời gian chạy, bạn sẽ gặp lỗi loại và đó là một vấn đề". Và bạn sẽ gặp lỗi.

Và thực sự điều ngược lại cũng đúng. Pytype sẽ trở nên khoan dung hơn trong các tình huống sẽ không gây ra lỗi thời gian chạy.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Dưới đây là một ví dụ về một hàm, nó lấy một danh sách, danh sách có ở chuỗi bên trong nó và tôi nối một số nguyên trong đó, lặp lại nó và in nó.

Điều này sẽ thành công nếu tôi cố gắng chạy điều này. Nó hoàn toàn hợp lệ, mặc dù nó có thể hơi khó hiểu với các nhà phát triển của chúng tôi để trộn các chuỗi và số nguyên ở đây.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Nếu tôi chạy cái này, nó in chính xác một danh sách các chuỗi.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Pytype nói rằng không có lỗi ở đây.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Nhưng Mypy sẽ phàn nàn vì bạn đang cố gắng nối một số nguyên vào danh sách các chuỗi và nó không tương thích.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Bây giờ bạn có thể nói: "Tại sao?"

Điều này thật tuyệt vời, thật tuyệt khi chúng ta có điều này trong Python, tại sao tôi muốn sử dụng nó?

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Đầu tiên tôi sẽ nói khi nào bạn không nên sử dụng gõ tĩnh và câu trả lời là: về cơ bản không bao giờ.

Nó sẽ không làm tổn thương bạn, việc sử dụng không đau.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Một trường hợp khi bạn có thể không muốn sử dụng gõ tĩnh là nếu bạn sẽ sử dụng nó để thay thế các bài kiểm tra đơn vị của mình. Gõ tĩnh không phải là một thay thế cho các bài kiểm tra đơn vị.

Rất nhiều bài kiểm tra đơn vị thời gian cuối cùng là một thứ gì đó cuối cùng trông giống như bạn là loại chương trình của bạn, nhưng không phải vậy. Và thực sự bạn có thể cần cả kiểm tra gõ tĩnh và kiểm tra đơn vị cùng một lúc.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Khi nào bạn nên sử dụng gõ tĩnh? Về cơ bản, sử dụng nó càng nhiều càng tốt. Sử dụng nó một cách tự do, sử dụng nó trong những tình huống này:

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Có lẽ khi bạn là một hàng triệu tỷ lệ. Giống như tôi đã nói trước đây, python được gõ năng động đó là một trách nhiệm pháp lý, và vì vậy nếu bạn có hàng triệu dòng mã python, có lẽ bạn đã biết điều này, nhưng có lẽ bạn nên bắt đầu gõ tĩnh nó.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Dropbox nhận thấy rằng ở quy mô của họ, việc gõ động tạo ra một cách khó hiểu mã không cần thiết phải hiểu mã ảnh hưởng đến năng suất của nhà phát triển.

Đó là lý do tại sao tất cả các cửa hàng lớn như Google và Facebook đã đầu tư vào việc gõ tĩnh, bởi vì nó thực sự làm cho các nhà phát triển của họ sống dễ dàng hơn. Và việc thiếu gõ tĩnh là một trách nhiệm ở quy mô đó.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Bạn có thể tưởng tượng một biểu đồ trông như thế này, khi dòng mã của bạn tăng lên, mong muốn thêm các chú thích loại của bạn tăng lên và sự dễ dàng của nó đi xuống.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Bạn có thể ở đây, trừ khi bạn là Facebook, Dropbox hoặc Google.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Đây là thời điểm tốt để thêm gõ tĩnh.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Đây có lẽ là khi bạn thực sự sẽ làm điều đó, nhưng hãy ghi nhớ điều đó khi bạn đánh giá khi nào nên bắt đầu thêm gõ tĩnh. Nó dễ dàng hơn để làm điều đó sớm hơn.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Bạn nên sử dụng gõ tĩnh khi mã của bạn khó hiểu.

Thành thật mà nói, tất cả chúng ta đã viết mã khó hiểu. Bạn có thể nghĩ về việc gõ tĩnh là tài liệu được xác minh bằng máy.

Bạn thêm gõ vào chức năng Python của bạn cực kỳ khó hiểu và nó sẽ cho các nhà phát triển của bạn biết những gì chức năng đó nên mong đợi và quay trở lại. Và nó cũng sẽ cho phép bạn xác minh rằng nó thực sự được gọi là theo cách đó.

Nếu bạn cảm thấy cần phải ghi lại đầu vào và đầu ra của một hàm, đó có thể là một gợi ý rằng bạn chỉ nên loại nó.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Bạn nên sử dụng gõ tĩnh khi mã của bạn dành cho tiêu thụ mu. Giả sử bạn đang xuất bản một mô -đun trên PYPI: Thêm các chú thích loại giúp các nhà phát triển sử dụng mô -đun của bạn biết cách sử dụng nó. Và điều đó cũng có nghĩa là nếu họ đang sử dụng gõ tĩnh trong cơ sở mã của họ, họ cũng sẽ thực sự đánh giá cao rằng bạn cũng sẽ xuất bản các loại cho cơ sở mã của mình.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Một thời điểm tốt khác để sử dụng gõ tĩnh là trước khi thực hiện một cuộc di cư lớn hoặc thực hiện một bộ tái cấu trúc lớn. Đi và thêm các loại tĩnh vào mọi thứ mà bạn sắp thay đổi, và sau đó thay đổi nó, và xem bạn có nhận được một loạt các lỗi loại không. Bởi vì nếu bạn làm như vậy, điều đó có nghĩa là bạn đang gọi một số chức năng sai hoặc bạn đã bỏ lỡ một phần di chuyển của mình.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Và cuối cùng, bạn cũng có thể sử dụng gõ tĩnh để chỉ thử nghiệm gõ tĩnh. Như tôi đã nói, nó không bị tổn thương, thật dễ dàng để thêm một số loại tĩnh, miễn là bạn ở phiên bản Python mới nhất hỗ trợ nó.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Để kết luận: Đây là cách bạn có thể sử dụng gõ tĩnh trong Python chỉ trong năm bước dễ dàng.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Đầu tiên, tùy chọn, bạn có thể chuyển sang phiên bản Python mới hơn.

Như tôi đã nói, các bình luận loại sẽ cho phép bạn loại mã Python 2 cũ hơn, nhưng thực sự chúng ta có lẽ tất cả chúng ta nên di chuyển sang Python 3.6 trở lên. Bây giờ chúng tôi có Python 3,8, vì vậy ít nhất bạn nên vào 3.6.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Thứ hai, bạn có thể cài đặt một máy kiểm tra loại cục bộ.

Tôi không quan tâm đó là cái nào, cài đặt một, cài đặt nhiều, nó không quan trọng và tích hợp nó vào IDE của bạn. Điều này sẽ cho phép bạn bắt đầu nhận thông báo loại trong mã của mình ngay khi bạn chỉ thêm một dòng gõ tĩnh.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Và sau đó bạn có thể bắt đầu tùy chọn gõ CodeBase của mình.

Bạn có thể bắt đầu với chức năng khó nhất mà bạn có, một hàm không thể hiểu nhất hoặc bạn có thể bắt đầu với hàm dễ nhất, chức năng đơn giản nhất sẽ là loại dễ nhất để gõ. Chỉ cần chọn một khu vực quan trọng và bắt đầu ở đó.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Và sau đó, những gì bạn có thể làm khi bạn có một chút gõ tĩnh là bạn có thể bắt đầu chạy cùng một trình kiểm tra loại của mình với lớp lót của bạn.

Tôi cho rằng bạn đang làm Linting, mọi người có lẽ chỉ đang chạy float5 bây giờ. Chỉ cần thêm kiểm tra loại, chỉ cần chạy mypy cùng một lúc.

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Và cuối cùng bạn có thể thuyết phục tất cả đồng nghiệp của bạn tham gia cùng bạn trong vinh quang của việc gõ tĩnh.

Nếu bạn cần giúp đỡ thuyết phục họ, bạn có thể chia sẻ cuộc nói chuyện này với họ. 😉

Hướng dẫn static typing python pada versi - python gõ tĩnh trên phiên bản

Cảm ơn!

  • GitHub: float6
  • Twitter: float7