Dato che menzioni Python, la domanda non è puramente teorica. Quindi provo a dare una prospettiva più ampia sui tipi. I tipi sono cose diverse per persone diverse. Ho raccolto almeno 5 nozioni distinte (ma correlate) di tipi:
I sistemi di tipo sono sistemi logici e impostano teorie.
Un sistema di tipi associa un tipo a ciascun valore calcolato. Esaminando il flusso di questi valori, un sistema di tipi tenta di provare o garantire che non si possano verificare errori di tipo.
Tipo è una classificazione che identifica uno dei vari tipi di dati, come valori reali, numeri interi o booleani, che determina i possibili valori per quel tipo; le operazioni che possono essere eseguite su valori di quel tipo; il significato dei dati; e il modo in cui i valori di quel tipo possono essere memorizzati
I tipi di dati astratti consentono l'astrazione dei dati in linguaggi di alto livello. Gli ADT sono spesso implementati come moduli: l'interfaccia del modulo dichiara procedure che corrispondono alle operazioni ADT. Questa strategia di occultamento delle informazioni consente di modificare l'implementazione del modulo senza disturbare i programmi client.
Le implementazioni del linguaggio di programmazione utilizzano tipi di valori per scegliere la memoria necessaria per i valori e gli algoritmi per le operazioni sui valori.
Le citazioni provengono da Wikipedia, ma posso fornire riferimenti migliori in caso di necessità.
I tipi 1 sono nati dal lavoro di Russel, ma oggi non sono semplicemente protetti dai paradossi: il linguaggio tipizzato della teoria dei tipi di omotopia è un nuovo modo per codificare la matematica in un linguaggio formale comprensibile dalla macchina e un nuovo modo per gli umani di comprendere le basi di matematica. (Il "vecchio" modo è codificare usando una teoria degli assiomatici).
I tipi 2-5 sono nati nella programmazione da diverse esigenze: evitare bug, classificare i progettisti e programmatori di software di dati con cui lavorare, progettare sistemi di grandi dimensioni e implementare i linguaggi di programmazione in modo efficiente rispettivamente.
I sistemi di tipo in C / C ++, Ada, Java, Python non sono nati dal lavoro di Russel o dal desiderio di evitare bug. Nacquero per necessità di descrivere diversi tipi di dati là fuori (es. "Il cognome è una stringa di caratteri e non un numero"), modularizzare la progettazione del software e scegliere rappresentazioni di basso livello per i dati in modo ottimale. Queste lingue non hanno tipi-1 o tipi-2. Java garantisce la relativa sicurezza dai bug non dimostrando la correttezza del programma usando il sistema dei tipi, ma attraverso un'attenta progettazione del linguaggio (senza aritmetica del puntatore) e del sistema di runtime (macchina virtuale, verifica del bytecode). Il sistema di tipi in Java non è né un sistema logico né una teoria dell'insieme.
Tuttavia, il sistema di tipi nel linguaggio di programmazione Agda è una variante moderna del sistema di tipi di Russel (basato sul lavoro successivo o su Per Martin-Lof e altri matematici). Il sistema di tipi in Agda è progettato per esprimere le proprietà matematiche del programma e delle prove di tali proprietà, è un sistema logico e una teoria dell'insieme.
Non ci sono distinzioni bianco-nero qui: molte lingue si incastrano tra loro. Ad esempio, il sistema di tipi del linguaggio Haskell ha radici nel lavoro di Russel, può essere visto come un sistema Agda semplificato, ma dal punto di vista matematico, è incoerente (contraddittorio) se visto come un sistema logico o una teoria dell'insieme.
Tuttavia, come veicolo teorico per proteggere i programmi Haskell dai bug, funziona abbastanza bene. È anche possibile utilizzare i tipi per codificare determinate proprietà e le relative prove, ma non tutte le proprietà possono essere codificate e il programmatore può comunque violare le proprietà dimostrate se utilizza hack sporchi scoraggiati.
Il sistema di tipi di Scala è ancora più lontano dal lavoro di Russel e dal linguaggio di prova perfetto di Agda, ma ha ancora radici nel lavoro di Russel.
Per quanto riguarda la dimostrazione delle proprietà dei linguaggi industriali i cui sistemi di tipi non sono stati progettati per questo, ci sono molti approcci e sistemi.
Per approcci interessanti ma diversi, vedi il progetto di ricerca Coq e Microsoft Boogie. Coq si affida alla teoria dei tipi per generare programmi imperativi dai programmi Coq. Boogie si basa sull'annotazione di programmi imperativi con proprietà e sulla dimostrazione di quelle proprietà con il proverore di teoremi Z3 usando un approccio completamente diverso rispetto a Coq.