Protocolli in Python

Python Protocols

Come utilizzare la sottoscrizione strutturale

Python 3.8 ha introdotto una nuova e interessante funzionalità: i protocolli. I protocolli sono un’alternativa alle classi di base astratte (ABC) e consentono la sottoscrizione strutturale – verificare se due classi sono compatibili in base agli attributi e alle funzioni disponibili. In questo post approfondiremo i dettagli su questo argomento e mostreremo come utilizzare i protocolli utilizzando esempi pratici.

Foto di Chris Liverani su Unsplash

Tipizzazione in Python

Iniziamo discutendo di come è tipizzato Python. È un linguaggio di tipo dinamico, il che significa che i tipi vengono dedotti a tempo di esecuzione e il seguente codice viene eseguito senza problemi:

def add(x, y):    return x + yprint(add(2, 3))print(add("str1", "str2"))

La prima chiamata restituisce l’addizione di interi restituendo 5, la seconda restituisce la concatenazione di stringhe restituendo “str1str2”. Questo è diverso, ad esempio, da C++, che è un linguaggio di tipo statico – e in cui dobbiamo fornire dichiarazioni di tipo:

int add(int x, int y) {    return x + y;}std::string add(std::string x, std::string y) {    return x + y;}int main(){    std::cout<<add(2, 3);    std::cout << add("str1", "str2");    return 0;}

La tipizzazione statica offre il vantaggio di poter individuare gli errori a tempo di compilazione, mentre nei linguaggi di tipo dinamico ci si imbatte in questi errori solo durante l’esecuzione. D’altra parte, la tipizzazione dinamica può consentire una prototipazione e una sperimentazione più rapide – uno dei motivi per cui Python è diventato così popolare.

La tipizzazione dinamica è anche chiamata duck typing, basata sul detto: “se cammina come un’anatra e fa il verso come un’anatra, allora deve essere un’anatra”. Ergo: se gli oggetti offrono gli stessi attributi/funzioni, dovrebbero essere trattati allo stesso modo e possono essere passati a funzioni che richiedono l’altro tipo.

Tuttavia, soprattutto in prodotti software più grandi e professionali, questa mancanza di affidabilità offre più svantaggi che vantaggi – e quindi la tendenza va verso il controllo dei tipi statici, ad esempio tramite l’uso di suggerimenti di tipo con mypy.

Sottotipizzazione

Un problema interessante – accennato in precedenza, ad esempio, nel breve paragrafo sulla duck typing – è la sottotipizzazione. Se abbiamo una funzione con firma foo(x: X), quali altre classi oltre a X mypy permette di passare alla funzione? (Nota che ora solo…