Como mencionas Python, la pregunta no es puramente teórica. Así que trato de dar una perspectiva más amplia sobre los tipos. Los tipos son cosas diferentes para diferentes personas. He recopilado al menos 5 nociones distintas (pero relacionadas) de tipos:
Los sistemas de tipos son sistemas lógicos y teorías de conjuntos.
Un sistema de tipos asocia un tipo con cada valor calculado. Al examinar el flujo de estos valores, un sistema de tipos intenta probar o garantizar que no se produzcan errores de tipo.
Tipo es una clasificación que identifica uno de varios tipos de datos, como valor real, entero o booleano, que determina los valores posibles para ese tipo; las operaciones que se pueden realizar en valores de ese tipo; el significado de los datos; y la forma en que se pueden almacenar valores de ese tipo
Los tipos de datos abstractos permiten la abstracción de datos en lenguajes de alto nivel. Los ADT a menudo se implementan como módulos: la interfaz del módulo declara los procedimientos que corresponden a las operaciones de ADT. Esta estrategia de ocultación de información permite cambiar la implementación del módulo sin perturbar los programas del cliente.
Las implementaciones de lenguaje de programación usan tipos de valores para elegir el almacenamiento que necesitan los valores y algoritmos para las operaciones en los valores.
Las citas son de Wikipedia, pero puedo proporcionar mejores referencias en caso de necesidad.
Los tipos 1 surgieron del trabajo de Russel, pero hoy no solo están protegidos de las paradojas: el lenguaje mecanografiado de la teoría de los tipos de homotopía es una nueva forma de codificar las matemáticas en un lenguaje formal, entendible por la máquina, y una nueva forma para que los humanos entiendan los fundamentos de las matematicas. (La forma "antigua" es codificar usando una teoría de conjuntos axiomática).
Los tipos 2-5 surgieron en la programación a partir de varias necesidades diferentes: evitar errores, clasificar los diseñadores de software de datos y los programadores con los que trabajan, diseñar sistemas grandes e implementar lenguajes de programación de manera eficiente, respectivamente.
Los sistemas de tipos en C / C ++, Ada, Java, Python no surgieron del trabajo de Russel o del deseo de evitar errores. Surgieron de la necesidad de describir diferentes tipos de datos (por ejemplo, "el apellido es una cadena de caracteres y no un número"), modularizar el diseño del software y elegir representaciones de bajo nivel para los datos de manera óptima. Estos idiomas no tienen tipos-1 o tipos-2. Java garantiza una seguridad relativa contra errores no mediante la prueba de la corrección del programa utilizando el sistema de tipos, sino mediante un diseño cuidadoso del lenguaje (sin aritmética de puntero) y el sistema de tiempo de ejecución (máquina virtual, verificación de código de bytes). El sistema de tipos en Java no es un sistema lógico ni una teoría de conjuntos.
Sin embargo, el sistema de tipos en el lenguaje de programación Agda es una variante moderna del sistema de tipos de Russel (basado en trabajos posteriores o de Per Martin-Lof y otros matemáticos). El sistema de tipos en Agda está diseñado para expresar las propiedades matemáticas del programa y las pruebas de esas propiedades, es un sistema lógico y una teoría de conjuntos.
Aquí no hay distinción entre blanco y negro: muchos idiomas encajan entre ellos. Por ejemplo, el sistema de tipos del lenguaje Haskell tiene raíces en el trabajo de Russel, puede verse como un sistema simplificado de Agda, pero desde el punto de vista matemático, es inconsistente (autocontradictorio) si se ve como un sistema lógico o una teoría de conjuntos.
Sin embargo, como vehículo teórico para proteger los programas de Haskell de errores, funciona bastante bien. Incluso puede usar tipos para codificar ciertas propiedades y sus pruebas, pero no todas las propiedades pueden codificarse, y el programador aún puede violar las propiedades probadas si usa hacks sucios desalentados.
El sistema de tipos de Scala está aún más alejado del trabajo de Russel y del lenguaje de prueba perfecto de Agda, pero aún tiene raíces en el trabajo de Russel.
En cuanto a las propiedades de prueba de los lenguajes industriales cuyos sistemas de tipos no fueron diseñados para eso, existen muchos enfoques y sistemas.
Para enfoques interesantes pero diferentes, vea el proyecto de investigación Coq y Microsoft Boogie. Coq se basa en la teoría de tipos para generar programas imperativos a partir de programas Coq. Boogie se basa en la anotación de programas imperativos con propiedades y prueba de esas propiedades con el probador de teoremas Z3 utilizando un enfoque completamente diferente al de Coq.