Python 3: la scelta di rompere la compatibilità

Python 3.0 corregge le inconsistenze storiche del linguaggio: print diventa funzione, stringhe Unicode di default, divisione vera. Una transizione che richiederà anni.

Open SourceWeb Open SourcePythonPython 3SviluppoMigrazione

Una decisione deliberata

Il 3 dicembre 2008, la comunità Python rilascia Python 3.0, la prima versione del linguaggio che non è retrocompatibile con le versioni precedenti. Non si tratta di un incidente né di un effetto collaterale: è una scelta progettuale deliberata. Dopo oltre quindici anni di sviluppo, il linguaggio ha accumulato inconsistenze, ridondanze e decisioni di design che non possono essere corrette senza rompere il codice esistente.

Guido van Rossum, creatore di Python e BDFL (Benevolent Dictator For Life) del progetto, ha guidato il processo attraverso una serie di PEP (Python Enhancement Proposals) che documentano ogni modifica e la sua motivazione. Il principio guida è chiaro: eliminare i “modi sbagliati” di fare le cose, anche a costo di una migrazione dolorosa.

Le modifiche principali

Le modifiche di Python 3 toccano aspetti fondamentali del linguaggio:

print diventa una funzione. In Python 2, print è un’istruzione (statement): print "hello". In Python 3 è una funzione built-in: print("hello"). Il cambiamento non è cosmetico — una funzione può essere sostituita, passata come argomento, utilizzata in espressioni lambda. È anche la modifica che rompe il maggior numero di script esistenti.

Stringhe Unicode di default. In Python 2 convivono due tipi di stringa: str (byte) e unicode (testo). La confusione tra i due è fonte costante di errori, specialmente nella gestione di dati internazionalizzati. Python 3 adotta Unicode come tipo stringa predefinito (str), con un tipo bytes separato ed esplicito per i dati binari.

Divisione vera. In Python 2, 5/2 restituisce 2 (divisione intera). In Python 3, 5/2 restituisce 2.5 (divisione float). La divisione intera esplicita si ottiene con l’operatore //. Questo elimina una classe di errori sottili nei calcoli numerici.

Altre modifiche includono: le viste al posto delle liste per dict.keys(), dict.values() e dict.items(); la funzione range() che sostituisce xrange(); la rimozione delle comparazioni implicite tra tipi diversi; una gerarchia delle eccezioni semplificata.

Il costo della transizione

La rottura della compatibilità ha un costo concreto. L’ecosistema Python è vasto: migliaia di librerie, framework e applicazioni sono scritte per Python 2. La migrazione richiede di aggiornare il codice, testarlo e verificare che tutte le dipendenze siano compatibili. La FSF è la comunità hanno rilasciato lo strumento 2to3 per automatizzare le conversioni più comuni, ma la migrazione completa resta un processo manuale e incrementale.

Python 2 continuerà a ricevere rilasci di manutenzione. La transizione a Python 3 è appena iniziata e richiederà tempo — probabilmente anni — prima che l’ecosistema converga sulla nuova versione. La scommessa della comunità è che il costo della migrazione sarà inferiore al costo di mantenere indefinitamente le inconsistenze del passato.

Link: python.org

Vuoi supporto? Sei sotto attacco? Stato dei servizi
Vuoi supporto? Sei sotto attacco? Stato dei servizi