Vì bạn đề cập đến Python, câu hỏi không hoàn toàn là lý thuyết kiểu. Vì vậy, tôi cố gắng đưa ra một quan điểm rộng hơn về các loại. Các loại là những thứ khác nhau cho những người khác nhau. Tôi đã thu thập ít nhất 5 khái niệm khác nhau (nhưng có liên quan) về các loại:
Loại hệ thống là hệ thống logic và thiết lập lý thuyết.
Một hệ thống loại liên kết một loại với mỗi giá trị được tính toán. Bằng cách kiểm tra luồng của các giá trị này, một hệ thống loại cố gắng chứng minh hoặc đảm bảo rằng không có lỗi loại nào có thể xảy ra.
Loại là một phân loại xác định một trong các loại dữ liệu khác nhau, chẳng hạn như giá trị thực, số nguyên hoặc Boolean, xác định các giá trị có thể có cho loại đó; các hoạt động có thể được thực hiện trên các giá trị của loại đó; ý nghĩa của dữ liệu; và cách các giá trị của loại đó có thể được lưu trữ
Các kiểu dữ liệu trừu tượng cho phép trừu tượng hóa dữ liệu bằng các ngôn ngữ cấp cao. Các ADT thường được triển khai dưới dạng các mô-đun: giao diện của mô-đun khai báo các quy trình tương ứng với các hoạt động của ADT. Chiến lược che giấu thông tin này cho phép thay đổi mô đun mà không làm phiền các chương trình máy khách.
Việc triển khai ngôn ngữ lập trình sử dụng các loại giá trị để chọn lưu trữ các giá trị cần và thuật toán cho các hoạt động trên các giá trị.
Các trích dẫn từ Wikipedia, nhưng tôi có thể cung cấp các tài liệu tham khảo tốt hơn nếu cần.
Loại 1 phát sinh từ công việc của Russel, nhưng ngày nay chúng không chỉ đơn thuần bảo vệ khỏi những nghịch lý: ngôn ngữ đánh máy của lý thuyết kiểu đồng luân là một cách mới để mã hóa toán học bằng ngôn ngữ chính thức, dễ hiểu về máy móc và là cách mới để con người hiểu được nền tảng của toán học. (Cách "cũ" là mã hóa bằng lý thuyết tập hợp tiên đề).
Các loại 2-5 phát sinh trong lập trình từ một số nhu cầu khác nhau: để tránh lỗi, phân loại các nhà thiết kế và lập trình phần mềm dữ liệu làm việc với, thiết kế các hệ thống lớn và thực hiện các ngôn ngữ lập trình một cách hiệu quả tương ứng.
Loại hệ thống trong C / C ++, Ada, Java, Python không phát sinh từ công việc của Russel hoặc mong muốn tránh lỗi. Họ nảy sinh nhu cầu mô tả các loại dữ liệu khác nhau (ví dụ: "họ là chuỗi ký tự chứ không phải số"), mô đun hóa thiết kế phần mềm và chọn cách biểu diễn mức độ thấp cho dữ liệu một cách tối ưu. Các ngôn ngữ này không có loại-1 hoặc loại-2. Java đảm bảo an toàn tương đối khỏi các lỗi không phải bằng cách chứng minh tính đúng đắn của chương trình bằng cách sử dụng hệ thống loại, mà bằng một thiết kế cẩn thận về ngôn ngữ (không có số học con trỏ) và hệ thống thời gian chạy (máy ảo, xác minh mã byte). Kiểu hệ thống trong Java không phải là một hệ thống logic hay lý thuyết tập hợp.
Tuy nhiên, hệ thống loại trong ngôn ngữ lập trình Agda là một biến thể hiện đại của hệ thống loại của Russel (dựa trên công việc sau này hoặc Per Martin-Lof và các nhà toán học khác). Hệ thống loại trong Agda được thiết kế để thể hiện các thuộc tính toán học của chương trình và bằng chứng về các tính chất đó, nó là một hệ thống logic và lý thuyết tập hợp.
Không có sự phân biệt trắng đen ở đây: nhiều ngôn ngữ phù hợp ở giữa. Ví dụ, hệ thống ngôn ngữ Haskell có nguồn gốc từ công việc của Russel, có thể được xem là hệ thống đơn giản của Agda, nhưng từ quan điểm toán học, nó không nhất quán (tự mâu thuẫn) nếu được xem là một hệ thống logic hoặc lý thuyết tập hợp.
Tuy nhiên, là một phương tiện lý thuyết để bảo vệ các chương trình Haskell khỏi các lỗi, nó hoạt động khá tốt. Bạn thậm chí có thể sử dụng các loại để mã hóa các thuộc tính nhất định và bằng chứng của chúng, nhưng không phải tất cả các thuộc tính đều có thể được mã hóa và lập trình viên vẫn có thể vi phạm các thuộc tính đã được chứng minh nếu anh ta sử dụng các bản hack bẩn được khuyến khích.
Kiểu hệ thống của Scala thậm chí còn xa hơn từ công việc của Russel và ngôn ngữ chứng minh hoàn hảo của Agda, nhưng vẫn có nguồn gốc từ công việc của Russel.
Đối với việc chứng minh tính chất của các ngôn ngữ công nghiệp có hệ thống loại không được thiết kế cho điều đó, có nhiều cách tiếp cận và hệ thống.
Đối với các phương pháp thú vị nhưng khác nhau, xem dự án nghiên cứu Coq và Microsoft Boogie. Coq dựa vào lý thuyết loại để tạo ra các chương trình bắt buộc từ các chương trình Coq. Boogie dựa vào chú thích của các chương trình mệnh lệnh với các thuộc tính và chứng minh các tính chất đó bằng phương châm định lý Z3 bằng cách sử dụng một cách tiếp cận hoàn toàn khác so với Coq.