Como você menciona o Python, a pergunta não é puramente teórica do tipo. Então, tento dar uma perspectiva mais ampla sobre os tipos. Tipos são coisas diferentes para pessoas diferentes. Reuni pelo menos 5 noções distintas (mas relacionadas) de tipos:
Sistemas de tipos são sistemas lógicos e teorias de conjuntos.
Um sistema de tipos associa um tipo a cada valor calculado. Examinando o fluxo desses valores, um sistema de tipos tenta provar ou garantir que nenhum erro de tipo possa ocorrer.
Type é uma classificação que identifica um dos vários tipos de dados, como valor real, número inteiro ou booleano, que determina os valores possíveis para esse tipo; as operações que podem ser feitas com valores desse tipo; o significado dos dados; e a maneira como os valores desse tipo podem ser armazenados
Tipos de dados abstratos permitem abstração de dados em idiomas de alto nível. Os ADTs geralmente são implementados como módulos: a interface do módulo declara procedimentos que correspondem às operações do ADT. Essa estratégia de ocultação de informações permite que a implementação do módulo seja alterada sem atrapalhar os programas clientes.
As implementações da linguagem de programação usam tipos de valores para escolher o armazenamento que os valores precisam e os algoritmos para operações nos valores.
As citações são da Wikipedia, mas posso fornecer melhores referências, se necessário.
Os tipos 1 surgiram do trabalho de Russel, mas hoje eles não estão apenas protegidos de paradoxos: a linguagem tipificada da teoria dos tipos de homotopia é uma nova maneira de codificar a matemática em uma linguagem formal e compreensível por máquina, e uma nova maneira para os humanos entenderem os fundamentos de matemática. (A maneira "antiga" é codificar usando uma teoria axiomática dos conjuntos).
Os tipos 2-5 surgiram na programação de várias necessidades diferentes: para evitar erros, para classificar os designers e programadores de software de dados, projetar sistemas grandes e implementar linguagens de programação eficientemente, respectivamente.
Os sistemas de tipos em C / C ++, Ada, Java, Python não surgiram do trabalho de Russel ou do desejo de evitar bugs. Surgiram da necessidade de descrever diferentes tipos de dados existentes (por exemplo, "sobrenome é uma cadeia de caracteres e não um número"), modularizar o design do software e escolher representações de baixo nível para os dados da melhor maneira possível. Esses idiomas não têm tipos 1 ou 2. O Java garante segurança relativa contra bugs, não por meio da comprovação da correção do programa usando o sistema de tipos, mas por um design cuidadoso da linguagem (sem aritmética de ponteiro) e do sistema de tempo de execução (máquina virtual, verificação de bytecode). O sistema de tipos em Java não é um sistema lógico nem uma teoria de conjuntos.
No entanto, o sistema de tipos na linguagem de programação Agda é uma variante moderna do sistema de tipos de Russel (com base em trabalhos posteriores ou Per Martin-Lof e outros matemáticos). O sistema de tipos no Agda é projetado para expressar propriedades matemáticas do programa e provas dessas propriedades, é um sistema lógico e uma teoria de conjuntos.
Não há distinção em preto e branco aqui: muitos idiomas se encaixam no meio. Por exemplo, o sistema de tipos da linguagem Haskell tem raízes no trabalho de Russel, pode ser visto como um sistema simplificado da Agda, mas, do ponto de vista matemático, é inconsistente (auto-contraditório) se visto como um sistema lógico ou uma teoria de conjuntos.
No entanto, como um veículo teórico para proteger os programas Haskell de bugs, ele funciona muito bem. Você ainda pode usar tipos para codificar certas propriedades e suas provas, mas nem todas as propriedades podem ser codificadas, e o programador ainda pode violar as propriedades comprovadas se ele usar hacks sujos desencorajados.
O sistema de tipos de Scala está ainda mais longe do trabalho de Russel e da linguagem de prova perfeita da Agda, mas ainda tem raízes no trabalho de Russel.
Quanto à prova de propriedades de linguagens industriais cujos sistemas de tipos não foram projetados para isso, existem muitas abordagens e sistemas.
Para abordagens interessantes, mas diferentes, consulte o projeto de pesquisa Coq e Microsoft Boogie. A Coq conta com a teoria dos tipos para gerar programas imperativos a partir dos programas da Coq. Boogie baseia-se na anotação de programas imperativos com propriedades e na comprovação dessas propriedades com o provador do teorema Z3, usando uma abordagem completamente diferente da Coq.