Una keyword che manca in Python

x0Ultimamente sono alle prese con Racket, l’ultima evoluzione del Lisp ma sono anche tentato da Haskell e in ogni caso continuo con Python. Ebbene sì, lo raccomando, quasi sempre 😀
Recentemente ho dovuto modificare uno script di quelli che nascono al volo per un caso specifico, lunghi poche righe ma poi con il tempo crescono con il rischio di ingarbugliarsi da far invidia a brainfuck.
Non parlo di come si può evitare questo degrado stilistico, cose che si sanno (e a volte si mettono anche in pratica) ma di una caratteristica di Python: l’assenza dell’istruzione case (Pascal, Delphi) detta anche switch (C) e cond (Lisp) e … (OK, ha parecchi nomi).

In Python si usa if:

ifA parte l’estrosità di scrivere elif al posto di elseif o else if funziona. E siccome c’è solo quella si usa, e funziona benissimo.

Ma perché manca case? Visto che siamo quasi in periodo di feste (auguri, nèh!) e questo genere di post piacciono quasi-quasi interrogo il Web sull’argomento.

Parto da un documento ufficiale PEP 3103 — A Switch/Case Statement.
Dice in sintesi Guido che è ripetitiva, inefficiente, non ci guadagni niente, non rende il codice più chiaro, insomma: A quick poll during my keynote presentation at PyCon 2007 shows this proposal has no popular support. I therefore reject it.

Non tutti sono d’accordo, per esempio texasman1979: I wrote a Python Switch statement. Uhmmm… è stato giudicato non chiaro e unphytonic. Chiuso. Anche se vedi dopo.

L’argomento è sentito, ecco un altro post simile, questa volta pythonic (sembra): Michael Schneider, Replacements for switch statement in Python?
E la soluzione che io conto di mettere per ultima me la stanno spoilerando tutti 🙄

Una ricetta diversa, C-istica viene proposta da Brian Beck: Readable switch construction without lambdas or dictionaries.
Riceve parecchi commenti, tra i quali “A very inventive approach!!! This is what I’d call an inspired solution. Of all switch-case substitutes, I probably like this one most“.

Più teorico l’articolo di Lance Finn Helsten, Python Switch Statement, ricco di notizie storiche, bello 😀

OK, A questo punto mi sembra di aver messo parecchia carne al fuoco. Restano due questioni in sospeso:

  • cosa ho fatto per il caso cui accennavo all’inizio: ho aggiunto un elif, dovevo solo fare manutenzione dello script e me la sono cavata con pochissime rihe di codice;
  • in generale se dovesse capitare in futuro come mi comporterei? Non ne sono sicuro ma probabilmente i dizionari, sono la via, come descritti nel post lasciato qui in fondo. Ma forse ha ragione teh BDFL, come sempre (kwasy).

L’ultima parola spetta a PyDanny, Daniel Roy Greenfeld, tra le altre cose a fantasy novel author e former NASA python coder: Why Doesn’t Python Have Switch/Case? Tutto da leggere.
E se continua a mancarvi il case là c’è la soluzione 😀

:mrgreen:

Posta un commento o usa questo indirizzo per il trackback.

Commenti

  • medeoTL  Il 23 dicembre 2015 alle 12:47

    Complimenti, bel post. Ho messo in “da-leggere” tutti i link 🙂

    • juhan  Il 23 dicembre 2015 alle 13:28

      Il compito per le vacanze 😉

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: