Оскільки ви згадуєте про Python, питання не є чисто типовим теоретичним. Тому я намагаюся дати ширший погляд на типи. Типи - це різні речі для різних людей. Я зібрав щонайменше 5 різних (але пов'язаних) понять типів:
Системи типів - це логічні системи та теорії множин.
Система типу асоціює тип з кожним обчисленим значенням. Вивчаючи потік цих значень, система типу намагається довести або переконатися, що помилок типу не може виникнути.
Тип - це класифікація, що ідентифікує один з різних типів даних, таких як реальна величина, ціле чи булеве значення, яка визначає можливі значення для цього типу; операції, які можна виконати на значеннях цього типу; значення даних; і способи значень цього типу можуть зберігатися
Абстрактні типи даних дозволяють абстрагувати дані мовами високого рівня. ADT часто реалізуються як модулі: інтерфейс модуля оголошує процедури, що відповідають операціям ADT. Ця стратегія приховування інформації дозволяє змінювати реалізацію модуля без порушення клієнтських програм.
Реалізація мови програмування використовує типи значень для вибору сховища необхідних значень та алгоритмів для операцій зі значеннями.
Цитати з Вікіпедії, але я можу надати кращі посилання, якщо виникне потреба.
Типи-1 виникли від роботи Русселя, але сьогодні вони не просто захищають від парадоксів: набрана мова теорії типу гомотопії - це новий спосіб кодування математики формальною, зрозумілою машиною мовою, і новий спосіб зрозуміти людині основи математики. ("Старий" спосіб кодування за допомогою теорії аксіоматичних множин).
Типи 2-5 виникли в програмуванні з кількох різних потреб: щоб уникнути помилок, класифікувати розробників програмного забезпечення даних та програмістів, розробляти великі системи та ефективно впроваджувати мови програмування відповідно.
Системи типу в C / C ++, Ada, Java, Python не виникли внаслідок роботи Русселя чи бажання уникати помилок. Вони виникли через необхідність описувати різні типи даних там (наприклад, "прізвище - це символьний рядок, а не число"), модулювати дизайн програмного забезпечення та оптимально вибирати представлення низьких рівнів для даних. Ці мови не мають типів-1 або типів-2. Java забезпечує відносну безпеку від помилок не за допомогою доведення коректності програми за допомогою системи типу, а ретельним дизайном мови (відсутність арифметики вказівника) та системи виконання (віртуальна машина, перевірка байт-коду). Система типів у Java не є ні логічною системою, ні теорією множин.
Однак система типу в мові програмування Agda - це сучасний варіант системи типу Русселя (заснований на пізніших роботах або Пер Мартін-Лоф та інші математики). Система типів в Agda призначена для вираження математичних властивостей програми та доказів цих властивостей, це логічна система та теорія множин.
Тут немає чорно-білих відмінностей: багато мов вписуються між собою. Наприклад, типова система мови Haskell має коріння у роботі Русселя, її можна розглядати як спрощену систему Агда, але з математичної точки зору вона є непослідовною (суперечливою), якщо розглядати її як логічну систему або теорію множин.
Однак, як теоретичний засіб захисту програм Haskell від помилок, він працює досить добре. Ви навіть можете використовувати типи для кодування певних властивостей та їхніх доказів, але не всі властивості можуть бути закодовані, і програміст все одно може порушувати перевірені властивості, якщо використовує відлякувані брудні хаки.
Типова система Scala ще більше віддаляється від праці Русселя та досконалої мови підтвердження Агди, але все ще має коріння в роботі Русселя.
Щодо доведення властивостей промислових мов, системи типів яких не були розроблені для цього, існує багато підходів та систем.
Про цікаві, але різні підходи див. Дослідницький проект Coq та Microsoft Boogie. Coq покладається на теорію типів для створення імперативних програм із програм Coq. Бугі покладається на анотацію імперативних програм із властивостями та доводить ці властивості за допомогою теореми Z3, використовуючи абсолютно інший підхід, ніж Coq.