[Python] Why Go is not good

Enrico Bianchi enrico.bianchi a ymail.com
Ven 17 Lug 2015 00:53:58 CEST


On 07/13/2015 11:55 AM, enrico franchi wrote:
> Il problema con l'overloading e' che rende un sacco di cose 
> drammaticamente piu' complicate: in presenza dello stesso caso che 
> menzioni (ovvero che non sai quale tipo sia una variabile) vuole dire 
> che effettivamente il tuo codice compilera', ma tu non avrai idea di 
> cosa faccia.
Mmm... non sono del tutto convinto, ovvero se io implemento Sum(int, 
int) e Sum(float, float), io so che posso avere o un int o un float e 
comportarmi di conseguenza

> Se non sai quale e' il tipo della variabile, vuole dire che non sai 
> quale variante del metodo verra' chiamata. E quindi di fatto non sai 
> che codice stai eseguendo. Ecco che un'innocua seccatura in assenza di 
> overloading e' diventata una possibile fonte di bachi.
Mmm... In altre parole, stai dicendo che Python, in quanto (di solito) 
non sai il tipo della variabile masolo il suo contenuto, e` altamente 
problematico ;)

> Questo e' un problema completamente *non* relativo a quello di la sopra.
Si, lo so, ma mi divertiva postarlo ;)

> non riesco a vedere come un problema il fatto che se dereferenzi 
> puntatori senza fare check sei nella guazza.
Senza offesa, ma da come rispondi sembrerebbe che ti soffermi piu` sul 
codice che sul concetto che volevo esprimere. Quello che interessa a me 
e` fare il catch del panic, in quanto, ad esempio, potrei voler fare in 
modo che l'applicazione non debba terminare assolutamente la sua 
esecuzione se non tramite intervento manuale. La soluzione, come dico in 
seguito (e come ho scoperto proprio grazie a questo thread) e` usando 
recover() in una deferred function, che di per se non e` anche una 
cattiva soluzione, anche se limitata dalla gestione dei defer in Go 
(ovvero a cascata non appena la funzione viene eseguita completamente)

> E il modo in cui lo risolvi in Python e', appunto, sbagliato a mio 
> avviso. In primo luogo il catch all except e' qualcosa che viene 
> sconsigliato da lungo tempo.
Posso essere d'accordo, ma secondo me lo sconsigliare una pratica del 
genere e` difettata dalle varie casistiche. Vedi ad esempio il caso di 
un'applicazione che non deve morire mai

> a = may_return_null(...)
> if a is not None:
>     f(a, ...)
Bruttino, non tanto perche` non mi piace, ma per com'e` scritto :)
La sintassi
if a:
   f(a,...)

E` molto piu` elegante (si, e` una pulce che non serve a molto) :)

> Fanno sempre e solo stack unwind, non danno controllo al programmatore.
Mmm... continuo a non capire... Un esempio (o della documentazione)?

> Come dicevo... quello non e' Go idiomatico a mio avviso.
Anche qua, mi sembra che tu abbia dato piu` peso al codice che ho usato 
come esempio piuttosto che al concetto che volevo esprimere. 
Personalmente ritengo che un try/except sia piu` elegante rispetto al 
dover fare il check per ogni error che ti viene restituito. Quello che 
intendo e` che, ad esempio, le operazioni di apertura, scrittura e 
chiusura di un file in Go devono essere gestite una per una, mentre in 
Python le posso gestire tutte nello stesso try/except che, 
personalmente, ritengo piu` sensato

> Ancora peggio quando hai codice "lineare" del tipo fai una serie di 
> operazioni una in fila all'altra. E hai errori vari che possono 
> arrivare da ognuna di queste (possibilmente con un set di eccezioni 
> non disgiunto per le varie chiamate).
Boh, a pensarci mi sembrano abbastanza semplici e pulite da gestire...

Enrico


Maggiori informazioni sulla lista Python