Поскольку вы упоминаете 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.