[Python] Why Go is not good

Enrico Bianchi enrico.bianchi a ymail.com
Sab 11 Lug 2015 17:03:03 CEST


On 07/03/2015 03:36 PM, enrico franchi wrote:
>  Parli di override o di overload?
Oddio, confondo sempre i termini...
Quello che mi interessava fare era semplicemente questo:

func Sum(a, b int) int {
   return a + b
}

func Sum(a, b float) float {
   return a + b
}

Certo, posso usare anche SumInt e SumFloat, ma diventa molto piu` 
complesso, ovvero potrei avere un caso in cui non so il tipo di 
variabile e prima me lo devo andare a cercare (a meno di non fare 
evidenti cast di variabili). Per inciso, ricordo un thread su di un 
gruppo Facebook in cui si criticava specificatamente la mancanza di 
questa caratteristica (e in cui era uscita anche questa cosa simpatica: 
http://play.golang.org/p/Isoo0CcAvr )

> Credo che tu non abbia chiara la gestione degli errori in Go.
Guarda, faccio prima a farti vedere cosa intendo: prendiamo questo caso:

package main

import (
   "fmt"
)

func Sum(a int, b *int) int {
     return a + *b;
}

func main() {
     var first int
     var second *int

     first = 1
     second = nil
     fmt.Println(Sum(first, second))
}

Questo codice genera, ovviamente, un runtime error in quanto passo un 
puntatore nil come argomento della somma. Ora, per gestire questa 
situazione, posso sicuramente fare un check che le variabili siano 
valorizzate, ma questo non mi protegge da altri "imprevisti". Per 
capirci, una situazione del genere in Python la gestirei cosi`:

def sum(a, b):
     return a + b

if __name__ == "__main__":
     try:
         print(sum(1, None))
     except:
         print("Argh!")

(il che potrebbe essere deprecabile in alcuni contesti, mentre in altri, 
e.g. per gestire la morte prematura delle connessioni da parte di un 
client, potrebbe essere una facility non indifferente)

> (o meglio, della versione castrata che e' implementata nei vari 
> Python, Java, C++ e combriccola con cui sei probabilmente familiare)
Per curiostia`, perche` sarebbero castrate?

> puoi usare panic.
Panic da quello che ho visto manda in traceback l'applicativo, ovvero e` 
l'equivalente di un raise in Python o di un throw in Java. Quello che 
vorrei fare io e` il catch

> (vedi gli esempi nella stdlib di Go)
Uhm, a quali esempi ti riferisci?

> Io personalmente trovo che la gestione degli errori di Go rende il 
> codice complessivamente molto piu' snello.
Dipende dal concetto di snello che hai Per esempio, se per creare un 
file, devo fare questo:

file, err := os.Create(filename)
if err != nil {
   panic(err)
}
defer file.Close()

invece di questo:

try:
     with open(filename, "w") as f:
         # Codice
except:
     raise Exception("Argh!")

beh, io trovo piu` snella e chiara la seconda :)

Enrico


Maggiori informazioni sulla lista Python