[Python] __debug__ e EAFP

Pietro Battiston ml a pietrobattiston.it
Mer 11 Maggio 2016 16:31:45 CEST


Il giorno mer, 11/05/2016 alle 11.48 +0100, enrico franchi ha scritto:
> 
> 2016-05-10 16:56 GMT+01:00 Pietro Battiston <ml a pietrobattiston.it>:
> > Capisco. Beh, d'ora in poi lo utilizzerò solo come programmazione
> > difensiva, ad esempio iniziando ogni mio listato con
> > 
> > assert(__debug__)
> > 
> Capisco la battuta, ma se e' non e' una battuta, spero di non dovere
> mai usare il tuo codice, visto che non potrei farlo funzionare. 

È una battuta!

(la riga è perfettamente equivalente a "pass", quindi il tuo codice
funzionerebbe tranquillamente ;-) )

> Oggettivamente non e' troppo sensato fare girare il codice in
> produzione in modalita' debug, poi fai te. ;)

Sì, d'accordo. Avrei ritenuto enormemente più sensato che "-O" non si
comportasse così... ma alla luce dell'eredità del C capisco.

Per quel che mi riguarda, tenderò ad evitare "assert" d'ora in poi.
Per dire: che sarebbe successo a questo tizio:
http://stackoverflow.com/questions/23778128/python-error-when-calling-f
ourier-transform-code
se quella particolare configurazione di valori gli fosse capitata solo
una volta in produzione? Boh, e chi lo sa, con ogni probabilità il
codice che segue l'assert fallito non è stato testato granché con
parametri non conformi (certamente non dalla suite di testing di numpy,
che gira in modalità debug), magari gli muore fulminato il gatto e non
capisce nemmeno perché finché non fa rigirare in modalità debug con gli
stessi dati di input...


> Poi spesso si fa, figuriamoci. Ma non poterlo fare, potrebbe
> risultare in problemi.
> 
> E detto fra noi... ma veramente vogliamo usare assert come *controllo
> di flusso*?
> 

Guarda, se l'avessi chiesto a me dieci anni fa, nemmeno avrei mai
sospettato che uno potesse utilizzare le eccezioni _in generale_ come
*controllo di flusso*...

> Cioe'... mi passi una lista vuota invece che una piena?
> AssertionError.
> Mi passi un intero invece di una stringa? AssertionError.
> Una chiamata http mi torna 503? AssertionError.
> 
> E poi chi lo debugga sto coso?
> 

Sono più o meno d'accordo con la risposta di Luca, ma in più... a me il
messaggio di errore "assert" sembrava proprio una meraviglia per il
debugging... sostanzialmente mi piaceva condensare (esempio stupido) un

if not civico.isdigit():
    raise ValueError("Il numero civico deve essere numerico")

in

assert(civico.isdigit()) "Il numero civico deve essere numerico"

senza perdere "capacità informativa".

Ciò detto, OK, ora che ho capito il funzionamento di "-O" tutti questi
sono ragionamenti puramente ipotetici, anche perché è chiaro che vista
da questo punto di vista un qualsiasi codice altrui che ti restituisca
una AssertionError è bacato.

Pietro


Maggiori informazioni sulla lista Python