Re: [Python] Python exception or return code.

2015-03-01 Per discussione Gollum1
Il 01 marzo 2015 01:10:51 CET, Massimiliano della Rovere 
massimiliano.dellarov...@gmail.com ha scritto:
Mi è venuto in mente che alla lista va aggiunto anche l'AsyncResult di
gevent http://www.gevent.org/gevent.event.html#gevent.event.AsyncResult
i
cui attributi value e exception implementano la logica che
vorresti.

Il giorno dom 1 mar 2015 00:57 Massimiliano della Rovere 
massimiliano.dellarov...@gmail.com ha scritto:

[...]


Argh... Come soffro

Byez
-- 
Gollum1
Teoro, dov'è il mio teoro

Inviato dal mio dispositivo Android con K-9 Mail. Perdonate la brevità e gli 
errori di battitura (maledetto correttore automatico).
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Python exception or return code.

2015-03-01 Per discussione Manlio Perillo
2015-02-28 19:34 GMT+01:00 enrico franchi enrico.fran...@gmail.com:

 [...]


 In Python la tradizione e' fare un uso abbastanza liberale delle
 eccezioni. Di per se si potrebbe avere anche la convenzione di ritornare
 *sempre* una tupla con qualcosa che indica l'errore. In Go si fa cosi' (o
 per lo meno, e' diffuso) ed e' piuttosto accettabile. Ci sono momenti in
 cui vorrei avere eccezioni vere e proprie, ma la cosa finisce li (si, so di
 panic, ma la sintassi e' talmente orribile che mi sembra di fare piangere
 gesubambino per niente).


Pensa a panic come una eccezione hardware, tipo SIGSEGV.
Non è una situazione da cui puoi effettuare un ricovero normale.

In alcuni casi panic viene anche usato quando i parametri di un
costruttore non sono validi
(in questo caso, in un mondo ideale, l'errore dovrebbe essere riportato dal
compilatore).

 [...]

Ciao  Manlio
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Python exception or return code.

2015-03-01 Per discussione Manlio Perillo
2015-02-28 23:00 GMT+01:00 enrico franchi enrico.fran...@gmail.com:

 [...]


 Perche' voglio dire... potremmo scrivere intere librerie e framework in
 Python (per dire) con la convenzione di ritornare tuple per la roba che
 puo' fallire. Alla fine credo che non si faccia non solo perche' non e' la
 maniera di Python, ma sopratutto perche' spesso e' scomodo.

 Io personalmente non trovo particolarmente carino qualcosa tipo

 func doSomething() (res Result, err error) {
   op, err := operation1()
   if err != nil {
 return
   }
   mah, err := operation2(op)
   if err != nil {
  return
   }
   res, err := operation3(op, mah)
   return
 }

 rispetto a qualcosa come

 def do_something():
 op = operation1()
 return operation3(op, operation2(op))

 Sara' che mi devo ancora abituare...


Il problema è che per capire Go devi leggere alcuni articoli chiave, come:
http://blog.golang.org/errors-are-values
http://blog.golang.org/constants

La documentazione di Go, AFAIK, è ancora abbastanza frammentata.
Io infatti ci ho messo più tempo di quanto avrei dovuto per entrare nel
linguaggio.


Ciao  Manlio
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Python exception or return code.

2015-03-01 Per discussione enrico franchi
2015-03-01 0:12 GMT+00:00 Giorgio Zoppi giorgio.zo...@gmail.com:

 Si,
 Grazie interessanti punti di vista. Il viaggio del apprendista stregone
 informatico inizia da consegnare:
 1. codice bug free
 2. codice bug free in qualsiasi condizione esterna.


Io direi che qui terminerebbe, ammesso che ci si arrivasse mai. Salvo che
le due condizioni sono equivalenti (se non hai bachi, non hai bachi manco
in condizioni estreme; se hai bachi che si manifestano solo in condizioni
estreme, vuole dire che comunque hai bachi). Mi sembra un po' una vana
speranza: codice *senza* bachi sopra una certa dimensione non e' che ne
veda molto.

In questo caso si han di fronte tre cose:
 1.  Programmer  bugs
 2. Errori recuperabili (soft error)
 3. Errori non recuperabili.

 Bene. La domanda e' siccome mi interessa la vostra esperienza, come
 gestite i punti 2, 3.


La classificazione che proponi non mi fa impazzire troppo (nel senso che e'
molto difficile separare i punti 2 e 3 a priori... mentre e' relativamente
chiaro come funziona a posteriori).

Faccio un esempio: devo parlare con un servizio. Allora vado a risolvere il
nome sul DNS. Non ho risposta. Cosa e'? Non ho modo di saperlo.
Probabilmente voglio una strategia di retry; se qualcuno si era mangiato il
mio pacchetto UDP per caso, probabilmente avro' risposta. Mi sembra un
esempio di errore recuperabile. Se invece tutta l'infrastruttura del DNS ha
preso fuoco e sta malamente capitolando... diciamo che probabilmente sto
per fronteggiare un fallimento totale. Ma ancora... non e' chiaramente un
bug (non nel mio software); e' un fallimento esterno.

Diciamo che in generale quando sono in una condizione che non posso
recuperare dentro l'applicativo quello che faccio e' fare in modo che le
cose vengano escalate ad un umano (allarmi, ticket). Il resto quando
possibile cerco di recuperarlo. Ma anche li... fare il retry di ogni
chiamata ad un servizio fallita (seguendo la semantica HTTP) non e' sempre
la cosa giusta. A volte e' meglio semplicemente fare fallire la chiamata di
piu' alto livello e l'utente provera' a ricaricare, il motivo e' che
altrimenti comunque la risposta all'utente e' troppo lenta (e c'e' caso che
provera' a ricaricare comunque, con conseguenze consumo di risorse),
inoltre rischia di sovraccaricare la rete e/o i servizi accessori. In altri
casi il retry e' un salva vita. Poi ci sono casi in cui non ha senso.

-- 
.
..: -enrico-
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Python exception or return code.

2015-03-01 Per discussione enrico franchi
2015-03-01 7:37 GMT+00:00 Giovanni Porcari giovanni.porc...@softwell.it:

 Ti devo una birra in più ;)


Gia' capito che finisco sbronzo... :)


-- 
.
..: -enrico-
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Python exception or return code.

2015-03-01 Per discussione enrico franchi
2015-03-01 14:40 GMT+00:00 Manlio Perillo manlio.peri...@gmail.com:

Pensa a panic come una eccezione hardware, tipo SIGSEGV.
 Non è una situazione da cui puoi effettuare un ricovero normale.


Ma si, questo mi e' chiaro. Non e' un segreto in Go. Anche se... per
esempio se accedo fuori bound ad un array mi prendo un panic. Ora... alcune
volte accedere a memoria a caso e' appunto un errore hardware. Altre volte
e' solo un errore dal punto di vista del linguaggio, non dell'hardware.
Quello che intendo, e' che se in C ho questo

char foo[4];
char bar[4];
char baz[4];

Se da bar vado fuori sono in piena undefined behavior del linguaggio. A
seconda di come funziona lo stack della piattaforma potrei finire in foo o
in baz. Oppure potrei finire altrove ancora, non ho nessuna garanzia.
Appunto, sono in undefined behavior.

Ma se faccio la stessa cosa concettualemnte in asm[0] non sto violando
nulla: non e' un errore hardware.
--
[0] ovvero scrivo un programma che mi mette sullo stack abbastanza per
ficcarci 12 caratteri che uso come 4 array separati e da quello di mezzo mi
metto su uno degli altri due, sto probabilmente ancora violando la
semantica che mi sono imposto, ma per il processore non sto facendo nulla
di male.

O poi mi va anche bene che gli accessi out mi diano panic... sarebbe
veramente complicato avere una signature tipo

el, err = arr[1]


In alcuni casi panic viene anche usato quando i parametri di un
 costruttore non sono validi
 (in questo caso, in un mondo ideale, l'errore dovrebbe essere riportato
 dal compilatore).


Che poi e' uno dei motivi per cui a suo tempo le eccezioni si diffusero...


-- 
.
..: -enrico-
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Python exception or return code.

2015-03-01 Per discussione Manlio Perillo
2015-03-01 16:33 GMT+01:00 enrico franchi enrico.fran...@gmail.com:


 2015-03-01 14:40 GMT+00:00 Manlio Perillo manlio.peri...@gmail.com:

 In alcuni casi panic viene anche usato quando i parametri di un
 costruttore non sono validi
 (in questo caso, in un mondo ideale, l'errore dovrebbe essere riportato
 dal compilatore).


 Che poi e' uno dei motivi per cui a suo tempo le eccezioni si diffusero...


Abbiamo la cattiva abitudine di abusare di qualsiasi nuovo strumento che ci
offre maggiore potenza rispetto agli strumenti precedenti.
Probabilmente perchè gli strumenti precedenti erano troppo rudimentali.


Ciao  Manlio
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Python exception or return code.

2015-02-28 Per discussione Giovanni Porcari

 Il giorno 28/feb/2015, alle ore 19:34, enrico franchi 
 enrico.fran...@gmail.com ha scritto:
 
 
 
 On Sat, Feb 28, 2015 at 2:06 PM, Giorgio Zoppi giorgio.zo...@gmail.com 
 wrote:
 Vorrei aprire una discussione senza cadere nella trappola del
 expert beginner. 
 In Python in quali casi e' preferibile usare eccezzioni o in quali casi e' 
 preferibile usare return codes. Secondo la teoria, spiegata in Framework 
 Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET 
 Libraries, :
 Exceptions integrate well with object-oriented languages. Object-oriented 
 languages tend to impose constraints on member signatures that are not 
 imposed by functions in non-OO languages. For example, in the case of 
 constructors, operator overloads, and properties, the developer has no choice 
 in the return value. For this reason, it is not possible to standardize on 
 return-value-based error reporting for object-oriented frameworks. An error 
 reporting method, such as exceptions, which is out of band of the method 
 signature is the only option.
 
 Ma ne la vita quotidiana si apprende dell'esperienza e non solo dalla teoria. 
 Durante la vostra esperienza vi e' capitato di decidere questo?
 
 Non capisco la domanda. Stai chiedendo se ho mai usato le eccezioni (si), se 
 ho mai scritto codice che lancia intenzionalmente eccezioni (si), se ho mai 
 scritto codice che non avrei potuto scrivere facilmente senza eccezioni 
 (essenzialmente si) o quale sia la mia posizione a riguardo? 
 
 Come dire... boh. Dipende dal linguaggio e dipende dal contesto. Tipo in Java 
 lavorare con le eccezioni pone limitazioni simili a lavorare liberalmente 
 con i tipi di ritorno. Poi i tipi di ritorno hanno sempre il problema del 
 valore nullo (controllare tutto per None e' in generale seccante, specie 
 quando questo ti costringe a rendere None invalido perche' deve mostrarti 
 l'errore -- in questo preferisco di gran lunga Maybe/Optional, che almeno 
 funziona come si deve). 
 
 In Python la tradizione e' fare un uso abbastanza liberale delle eccezioni. 
 Di per se si potrebbe avere anche la convenzione di ritornare *sempre* una 
 tupla con qualcosa che indica l'errore. In Go si fa cosi' (o per lo meno, e' 
 diffuso) ed e' piuttosto accettabile. Ci sono momenti in cui vorrei avere 
 eccezioni vere e proprie, ma la cosa finisce li (si, so di panic, ma la 
 sintassi e' talmente orribile che mi sembra di fare piangere gesubambino per 
 niente).
 
 In Haskell anche li le eccezioni ci sono, ma fino ad un certo punto. Trovo 
 che non si integrino eccellentemente nel resto del linguaggio, per cui in 
 generale tendo ad usare Maybe/Either. Alcune volte mi sono mancate. Ma sono 
 secoli che non lavoro con Haskell. 
 
 Personalmente trovo che in un contesto imperativo/OOP le eccezioni siano 
 proprio una gran cosa. Le proprieta' che hanno sul controllo di flusso sono 
 spesso complicate da implementare altrimenti (o meglio, non complicate, solo 
 un sacco di boilerplate). Poi ci sono i problemi accessori: seguire il 
 controllo di flusso puo' diventare davvero un incubo, visto che diventa non 
 predicibile manco sapere se qualcosa termina guardandolo.
 
 def will_it_ever_end(a, b):
 while 1:
 a += b
 
 Davvero non abbiamo modo di sapere cosa succedera'.
 
 
 
 

Ho già avuto modo di dire che sono solo un autodidatta sia pure di lunga data
e quindi so che in questo momento rischio di dire fregnacce.

Però mi sono sempre chiesto una cosa: siccome in python comunque tutto è un 
oggetto,
non sarebbe in qualche modo plausibile rendere l'errore come attributo del 
risultato ?
Se ad esempio scrivo x=f(y) allora posso poi testare x.__error__ per sapere se 
c'è stato un errore.

Sono ragionevolmente certo che ci sia qualcosa di sbagliato in questo 
ragionamento ma
sono troppo ignorante sulla parte teorica di python (o meglio in generale sui 
linguaggi)
per capirlo. Enrico mi aiuti ?

Ciao

G.





___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Python exception or return code.

2015-02-28 Per discussione enrico franchi
2015-02-28 23:32 GMT+00:00 Giovanni Porcari giovanni.porc...@softwell.it:


 Però mi sono sempre chiesto una cosa: siccome in python comunque tutto è
 un oggetto,
 non sarebbe in qualche modo plausibile rendere l'errore come attributo del
 risultato ?
 Se ad esempio scrivo x=f(y) allora posso poi testare x.__error__ per
 sapere se c'è stato un errore.

 Sono ragionevolmente certo che ci sia qualcosa di sbagliato in questo
 ragionamento ma
 sono troppo ignorante sulla parte teorica di python (o meglio in generale
 sui linguaggi)
 per capirlo. Enrico mi aiuti ?


Un dettaglio che ti impedirebbe di farlo e' che determinati oggetti in
Python *non* hanno attributi arbitrari.
Per esempio None. Non riusciresti ad attaccargli sopra x.__error__.

Questo e' un motivo duro per cui non si puo' fare. Ma ovviamente se si
fosse voluto fare si sarebbe potuto dotare qualunque oggetto di un
attributo __error__.

Sulla parte pratica, credo che alla fine dei conti scrivere

x = f()
if x.__error__:
...

non porti vantaggio rispetto ad altri modi di gestire l'errore.

Confronta con

res, error = f()
if error:
...

e vedi che non e' che sia una miglioria enorme.

Inoltre ci sono cose minori, tipo il fatto di dovere pagare sempre un
puntatore (o analogo) per ogni oggetto (quindi un consumo di memoria non
trascurabile), anche quelli che non ne avrebbero bisogno.

Semmai la parte interessante potrebbe in qualche modo essere il concetto di
auto-propagare l'errore. Ovvero l'idea e' che se hai un __error__ in
entrata fai uscire qualcosa con un __error__. Questa strategia avrebbe
comunque due problemi abbastanza massicci:

1. e' terribilmente implicita. temo si finirebbe con un problema che alla
fine ha un __error__ e non si sa perche' (a meno di non avere una strategia
molto complicata e molto costosa per accumulare gli errori

2. in generale se hai un errore non sei in grado di darmi un oggetto che
abbia una parvenza di significato e appiccicargli __error__ non migliora
troppo le cose.

Mi spiego... se mi fai un metodo che ritorna una lista, mi ritorni una
lista vuota con __error__ e la cosa funziona (mi distingue il caso in cui
la lista vuota e' il vero ritorno e mi costruisci un valore valido del tipo
che vuoi ritornare).

Ma ci sono tipi che non hanno una lista vuota. Che so... un libro. Che
facciamo il libro vuoto? Cioe', in teoria si potrebbe creare un
linguaggio che funziona cosi'... alla fine dei conti si chiama
NullObjectPattern (meno il __error__) e in determinate circostanze e' buono.

-- 
.
..: -enrico-
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Python exception or return code.

2015-02-28 Per discussione enrico franchi
2015-02-28 21:04 GMT+00:00 Nicola Larosa n...@teknico.net:

 Enrico Franchi wrote:
  si potrebbe avere anche la convenzione di ritornare *sempre* una tupla
  con qualcosa che indica l'errore. In Go si fa cosi' (o per lo meno, e'
  diffuso)

 No no, che diffuso, il modo è quello e basta, vedi blog ufficiale:

 Error handling and Go
 http://blog.golang.org/error-handling-and-go

 Defer, Panic, and Recover
 http://blog.golang.org/defer-panic-and-recover

 nonché l'autorevole Dave Cheney:

 Why Go gets exceptions right
 http://dave.cheney.net/2012/01/18/why-go-gets-exceptions-right


Il modo e' quello perche' la stragrande maggioranza del codice Go fa
quello.
Personalmente, trovo sensato nella gran parte dei casi. Trovo che in altri
casi sia piu' sensato gestire gli errori tramite callback, o per lo meno,
progettare l'API in quella maniera. Poi chiaro come il sole che diventa
tutto piu' complesso.

Detto poi fra noi, fra la gestione degli errori di Python non so quale mi
piace di piu'. Devo cominciare ad avere roba in Go che fallisce male per
entrare davvero in mentalita'. Ovvero... in C la mancanza delle eccezioni
la sento tantissimo. In Haskell (che pure le ha, sebbene in generale non
sia idiomatico usarle come si farebbe in Python) ci sono stati casi in cui
le avrei volute. In Go per ora no... ma non e' che mi sia chiaro perche'
non mi manchi. Credo che sia perche' ho scritto davvero troppo poco codice
e non mi sono ancora rotto le palle di fare a mano cose che con le
eccezioni avrei gratis.

Perche' voglio dire... potremmo scrivere intere librerie e framework in
Python (per dire) con la convenzione di ritornare tuple per la roba che
puo' fallire. Alla fine credo che non si faccia non solo perche' non e' la
maniera di Python, ma sopratutto perche' spesso e' scomodo.

Io personalmente non trovo particolarmente carino qualcosa tipo

func doSomething() (res Result, err error) {
  op, err := operation1()
  if err != nil {
return
  }
  mah, err := operation2(op)
  if err != nil {
 return
  }
  res, err := operation3(op, mah)
  return
}

rispetto a qualcosa come

def do_something():
op = operation1()
return operation3(op, operation2(op))

Sara' che mi devo ancora abituare...




  ed e' piuttosto accettabile. Ci sono momenti in cui vorrei avere
  eccezioni vere e proprie, ma la cosa finisce li (si, so di panic, ma
  la sintassi e' talmente orribile che mi sembra di fare piangere
  gesubambino per niente).

 panic non è inteso per essere usato come eccezione, e la sintassi
 scomoda è intenzionale. Non farlo, faresti piangere Rob Pike prima che
 Gesù bambino, e tu non vuoi questo, vero?


Mi e' chiaro. La funzionalita' e' praticamente equivalente e hanno reso
molto chiaro che gli hanno dato una sintassi brutta e scomoda per non
incoraggiare. Poi detto fra noi, visto che Go schietto va di CSP e non di
Actor model [0] non sarebbe particolarmente facile gestire le eccezioni che
dovessero uscire dalle goroutine -- a meno di non ricostruirci sopra
l'actor model --.

O meglio... non sono completamente d'accordo con paninc non e' inteso per
essere usato come eccezione. Nel senso che panic/defer/recover ti
permetterebbero di costruire il classico error handling ad eccezioni.
Quello su cui sono d'accordo e' che Go idiomatico non usa le eccezioni
quando in altri linguaggi si userebbero, tutto li.

Alla fine nei vari linguaggi cambia tantissimo la pragmatica sull'uso delle
eccezioni. Python e' sul lato dello spettro le eccezioni per il normale
controllo di flusso sono perfettamente normali e non sono particolarmente
eccezionali, go e' sul lato opposto.

---
[0] non e' che parlo di impossibilita' effettiva, semplicemente il modello
e' sufficientemente diverso da non rendere comoda sta faccenda, tipo
linkare gli actors e avere il watcher che si suca le eccezioni del watched
e ci fa cose... si puo' creare tutto con le goroutine, niente da dire, ma
Go non e' concepito a quel modo e mi sta bene.


-- 
.
..: -enrico-
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Python exception or return code.

2015-02-28 Per discussione Nicola Larosa
Enrico Franchi wrote:
 si potrebbe avere anche la convenzione di ritornare *sempre* una tupla
 con qualcosa che indica l'errore. In Go si fa cosi' (o per lo meno, e'
 diffuso)

No no, che diffuso, il modo è quello e basta, vedi blog ufficiale:

Error handling and Go
http://blog.golang.org/error-handling-and-go

Defer, Panic, and Recover
http://blog.golang.org/defer-panic-and-recover

nonché l'autorevole Dave Cheney:

Why Go gets exceptions right
http://dave.cheney.net/2012/01/18/why-go-gets-exceptions-right


 ed e' piuttosto accettabile. Ci sono momenti in cui vorrei avere
 eccezioni vere e proprie, ma la cosa finisce li (si, so di panic, ma
 la sintassi e' talmente orribile che mi sembra di fare piangere
 gesubambino per niente).

panic non è inteso per essere usato come eccezione, e la sintassi
scomoda è intenzionale. Non farlo, faresti piangere Rob Pike prima che
Gesù bambino, e tu non vuoi questo, vero?

-- 
Nicola 'tekNico' Larosa http://www.tekNico.net/

Having a female-typical corpus callosum isn't a bug, it's a feature.
 - Eric Raymond, August 2013
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Python exception or return code.

2015-02-28 Per discussione Massimiliano della Rovere
Si pone però un problema in questo scenario:
dato che il risultato non può essere generato (a causa dell'errore), manca
qualcosa a cui agganciare il magic method __error__.

Una possibile soluzione a questo problema sono:
- i deferred di Twisted
https://twistedmatrix.com/documents/current/core/howto/defer.html

- i futures di Python 3.3+
https://docs.python.org/3/library/concurrent.futures.html#future-objects

- i future di tornado:
http://www.tornadoweb.org/en/stable/concurrent.html


(e in Javascript la libreria Q:
http://www.html.it/articoli/javascript-asincrono-le-promise-e-la-libreria-q/
)

Il giorno dom 1 mar 2015 alle ore 00:33 Giovanni Porcari 
giovanni.porc...@softwell.it ha scritto:


  Il giorno 28/feb/2015, alle ore 19:34, enrico franchi 
 enrico.fran...@gmail.com ha scritto:
 
 
 
  On Sat, Feb 28, 2015 at 2:06 PM, Giorgio Zoppi giorgio.zo...@gmail.com
 wrote:
  Vorrei aprire una discussione senza cadere nella trappola del
  expert beginner.
  In Python in quali casi e' preferibile usare eccezzioni o in quali casi
 e' preferibile usare return codes. Secondo la teoria, spiegata in Framework
 Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET
 Libraries, :
  Exceptions integrate well with object-oriented languages.
 Object-oriented languages tend to impose constraints on member signatures
 that are not imposed by functions in non-OO languages. For example, in the
 case of constructors, operator overloads, and properties, the developer has
 no choice in the return value. For this reason, it is not possible to
 standardize on return-value-based error reporting for object-oriented
 frameworks. An error reporting method, such as exceptions, which is out of
 band of the method signature is the only option.
 
  Ma ne la vita quotidiana si apprende dell'esperienza e non solo dalla
 teoria. Durante la vostra esperienza vi e' capitato di decidere questo?
 
  Non capisco la domanda. Stai chiedendo se ho mai usato le eccezioni
 (si), se ho mai scritto codice che lancia intenzionalmente eccezioni (si),
 se ho mai scritto codice che non avrei potuto scrivere facilmente senza
 eccezioni (essenzialmente si) o quale sia la mia posizione a riguardo?
 
  Come dire... boh. Dipende dal linguaggio e dipende dal contesto. Tipo in
 Java lavorare con le eccezioni pone limitazioni simili a lavorare
 liberalmente con i tipi di ritorno. Poi i tipi di ritorno hanno sempre il
 problema del valore nullo (controllare tutto per None e' in generale
 seccante, specie quando questo ti costringe a rendere None invalido
 perche' deve mostrarti l'errore -- in questo preferisco di gran lunga
 Maybe/Optional, che almeno funziona come si deve).
 
  In Python la tradizione e' fare un uso abbastanza liberale delle
 eccezioni. Di per se si potrebbe avere anche la convenzione di ritornare
 *sempre* una tupla con qualcosa che indica l'errore. In Go si fa cosi' (o
 per lo meno, e' diffuso) ed e' piuttosto accettabile. Ci sono momenti in
 cui vorrei avere eccezioni vere e proprie, ma la cosa finisce li (si, so di
 panic, ma la sintassi e' talmente orribile che mi sembra di fare piangere
 gesubambino per niente).
 
  In Haskell anche li le eccezioni ci sono, ma fino ad un certo punto.
 Trovo che non si integrino eccellentemente nel resto del linguaggio, per
 cui in generale tendo ad usare Maybe/Either. Alcune volte mi sono mancate.
 Ma sono secoli che non lavoro con Haskell.
 
  Personalmente trovo che in un contesto imperativo/OOP le eccezioni siano
 proprio una gran cosa. Le proprieta' che hanno sul controllo di flusso sono
 spesso complicate da implementare altrimenti (o meglio, non complicate,
 solo un sacco di boilerplate). Poi ci sono i problemi accessori: seguire il
 controllo di flusso puo' diventare davvero un incubo, visto che diventa non
 predicibile manco sapere se qualcosa termina guardandolo.
 
  def will_it_ever_end(a, b):
  while 1:
  a += b
 
  Davvero non abbiamo modo di sapere cosa succedera'.
 
 
 
 

 Ho già avuto modo di dire che sono solo un autodidatta sia pure di lunga
 data
 e quindi so che in questo momento rischio di dire fregnacce.

 Però mi sono sempre chiesto una cosa: siccome in python comunque tutto è
 un oggetto,
 non sarebbe in qualche modo plausibile rendere l'errore come attributo del
 risultato ?
 Se ad esempio scrivo x=f(y) allora posso poi testare x.__error__ per
 sapere se c'è stato un errore.

 Sono ragionevolmente certo che ci sia qualcosa di sbagliato in questo
 ragionamento ma
 sono troppo ignorante sulla parte teorica di python (o meglio in generale
 sui linguaggi)
 per capirlo. Enrico mi aiuti ?

 Ciao

 G.





 ___
 Python mailing list
 Python@lists.python.it
 http://lists.python.it/mailman/listinfo/python

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Python exception or return code.

2015-02-28 Per discussione Giorgio Zoppi
Si,
Grazie interessanti punti di vista. Il viaggio del apprendista stregone
informatico inizia da consegnare:
1. codice bug free
2. codice bug free in qualsiasi condizione esterna.

In questo caso si han di fronte tre cose:
1.  Programmer  bugs
2. Errori recuperabili (soft error)
3. Errori non recuperabili.

Bene. La domanda e' siccome mi interessa la vostra esperienza, come gestite
i punti 2, 3.
Saluti,
Giorgio.


Il giorno 1 marzo 2015 00:32, Giovanni Porcari giovanni.porc...@softwell.it
 ha scritto:


  Il giorno 28/feb/2015, alle ore 19:34, enrico franchi 
 enrico.fran...@gmail.com ha scritto:
 
 
 
  On Sat, Feb 28, 2015 at 2:06 PM, Giorgio Zoppi giorgio.zo...@gmail.com
 wrote:
  Vorrei aprire una discussione senza cadere nella trappola del
  expert beginner.
  In Python in quali casi e' preferibile usare eccezzioni o in quali casi
 e' preferibile usare return codes. Secondo la teoria, spiegata in Framework
 Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET
 Libraries, :
  Exceptions integrate well with object-oriented languages.
 Object-oriented languages tend to impose constraints on member signatures
 that are not imposed by functions in non-OO languages. For example, in the
 case of constructors, operator overloads, and properties, the developer has
 no choice in the return value. For this reason, it is not possible to
 standardize on return-value-based error reporting for object-oriented
 frameworks. An error reporting method, such as exceptions, which is out of
 band of the method signature is the only option.
 
  Ma ne la vita quotidiana si apprende dell'esperienza e non solo dalla
 teoria. Durante la vostra esperienza vi e' capitato di decidere questo?
 
  Non capisco la domanda. Stai chiedendo se ho mai usato le eccezioni
 (si), se ho mai scritto codice che lancia intenzionalmente eccezioni (si),
 se ho mai scritto codice che non avrei potuto scrivere facilmente senza
 eccezioni (essenzialmente si) o quale sia la mia posizione a riguardo?
 
  Come dire... boh. Dipende dal linguaggio e dipende dal contesto. Tipo in
 Java lavorare con le eccezioni pone limitazioni simili a lavorare
 liberalmente con i tipi di ritorno. Poi i tipi di ritorno hanno sempre il
 problema del valore nullo (controllare tutto per None e' in generale
 seccante, specie quando questo ti costringe a rendere None invalido
 perche' deve mostrarti l'errore -- in questo preferisco di gran lunga
 Maybe/Optional, che almeno funziona come si deve).
 
  In Python la tradizione e' fare un uso abbastanza liberale delle
 eccezioni. Di per se si potrebbe avere anche la convenzione di ritornare
 *sempre* una tupla con qualcosa che indica l'errore. In Go si fa cosi' (o
 per lo meno, e' diffuso) ed e' piuttosto accettabile. Ci sono momenti in
 cui vorrei avere eccezioni vere e proprie, ma la cosa finisce li (si, so di
 panic, ma la sintassi e' talmente orribile che mi sembra di fare piangere
 gesubambino per niente).
 
  In Haskell anche li le eccezioni ci sono, ma fino ad un certo punto.
 Trovo che non si integrino eccellentemente nel resto del linguaggio, per
 cui in generale tendo ad usare Maybe/Either. Alcune volte mi sono mancate.
 Ma sono secoli che non lavoro con Haskell.
 
  Personalmente trovo che in un contesto imperativo/OOP le eccezioni siano
 proprio una gran cosa. Le proprieta' che hanno sul controllo di flusso sono
 spesso complicate da implementare altrimenti (o meglio, non complicate,
 solo un sacco di boilerplate). Poi ci sono i problemi accessori: seguire il
 controllo di flusso puo' diventare davvero un incubo, visto che diventa non
 predicibile manco sapere se qualcosa termina guardandolo.
 
  def will_it_ever_end(a, b):
  while 1:
  a += b
 
  Davvero non abbiamo modo di sapere cosa succedera'.
 
 
 
 

 Ho già avuto modo di dire che sono solo un autodidatta sia pure di lunga
 data
 e quindi so che in questo momento rischio di dire fregnacce.

 Però mi sono sempre chiesto una cosa: siccome in python comunque tutto è
 un oggetto,
 non sarebbe in qualche modo plausibile rendere l'errore come attributo del
 risultato ?
 Se ad esempio scrivo x=f(y) allora posso poi testare x.__error__ per
 sapere se c'è stato un errore.

 Sono ragionevolmente certo che ci sia qualcosa di sbagliato in questo
 ragionamento ma
 sono troppo ignorante sulla parte teorica di python (o meglio in generale
 sui linguaggi)
 per capirlo. Enrico mi aiuti ?

 Ciao

 G.





 ___
 Python mailing list
 Python@lists.python.it
 http://lists.python.it/mailman/listinfo/python




-- 
Quiero ser el rayo de sol que cada día te despierta
para hacerte respirar y vivir en me.
Favola -Moda.
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Python exception or return code.

2015-02-28 Per discussione enrico franchi
On Sat, Feb 28, 2015 at 2:06 PM, Giorgio Zoppi giorgio.zo...@gmail.com
wrote:

 Vorrei aprire una discussione senza cadere nella trappola del
 expert beginner.
 In Python in quali casi e' preferibile usare eccezzioni o in quali casi e'
 preferibile usare return codes. Secondo la teoria, spiegata in *Framework
 Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET
 Libraries*, :
 Exceptions integrate well with object-oriented languages. Object-oriented
 languages tend to impose constraints on member signatures that are not
 imposed by functions in non-OO languages. *For example, in the case of
 constructors, operator overloads, and properties, the developer has no
 choice in the return value.* For this reason, it is not possible to
 standardize on return-value-based error reporting for object-oriented
 frameworks. *An error reporting method, such as exceptions, which is out
 of band of the method signature is the only option.*

 Ma ne la vita quotidiana si apprende dell'esperienza e non solo dalla
 teoria. Durante la vostra esperienza vi e' capitato di decidere questo?


Non capisco la domanda. Stai chiedendo se ho mai usato le eccezioni (si),
se ho mai scritto codice che lancia intenzionalmente eccezioni (si), se ho
mai scritto codice che non avrei potuto scrivere facilmente senza eccezioni
(essenzialmente si) o quale sia la mia posizione a riguardo?

Come dire... boh. Dipende dal linguaggio e dipende dal contesto. Tipo in
Java lavorare con le eccezioni pone limitazioni simili a lavorare
liberalmente con i tipi di ritorno. Poi i tipi di ritorno hanno sempre il
problema del valore nullo (controllare tutto per None e' in generale
seccante, specie quando questo ti costringe a rendere None invalido
perche' deve mostrarti l'errore -- in questo preferisco di gran lunga
Maybe/Optional, che almeno funziona come si deve).

In Python la tradizione e' fare un uso abbastanza liberale delle eccezioni.
Di per se si potrebbe avere anche la convenzione di ritornare *sempre* una
tupla con qualcosa che indica l'errore. In Go si fa cosi' (o per lo meno,
e' diffuso) ed e' piuttosto accettabile. Ci sono momenti in cui vorrei
avere eccezioni vere e proprie, ma la cosa finisce li (si, so di panic, ma
la sintassi e' talmente orribile che mi sembra di fare piangere gesubambino
per niente).

In Haskell anche li le eccezioni ci sono, ma fino ad un certo punto. Trovo
che non si integrino eccellentemente nel resto del linguaggio, per cui in
generale tendo ad usare Maybe/Either. Alcune volte mi sono mancate. Ma sono
secoli che non lavoro con Haskell.

Personalmente trovo che in un contesto imperativo/OOP le eccezioni siano
proprio una gran cosa. Le proprieta' che hanno sul controllo di flusso sono
spesso complicate da implementare altrimenti (o meglio, non complicate,
solo un sacco di boilerplate). Poi ci sono i problemi accessori: seguire il
controllo di flusso puo' diventare davvero un incubo, visto che diventa non
predicibile manco sapere se qualcosa termina guardandolo.

def will_it_ever_end(a, b):
while 1:
a += b

Davvero non abbiamo modo di sapere cosa succedera'.





-- 
.
..: -enrico-
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Python exception or return code.

2015-02-28 Per discussione Giovanni Porcari

 Il giorno 01/mar/2015, alle ore 01:35, enrico franchi 
 enrico.fran...@gmail.com ha scritto:
 
 
 
 2015-02-28 23:32 GMT+00:00 Giovanni Porcari giovanni.porc...@softwell.it:
 
 Però mi sono sempre chiesto una cosa: siccome in python comunque tutto è un 
 oggetto,
 non sarebbe in qualche modo plausibile rendere l'errore come attributo del 
 risultato ?
 Se ad esempio scrivo x=f(y) allora posso poi testare x.__error__ per sapere 
 se c'è stato un errore.
 
 Sono ragionevolmente certo che ci sia qualcosa di sbagliato in questo 
 ragionamento ma
 sono troppo ignorante sulla parte teorica di python (o meglio in generale sui 
 linguaggi)
 per capirlo. Enrico mi aiuti ?
 
 Un dettaglio che ti impedirebbe di farlo e' che determinati oggetti in Python 
 *non* hanno attributi arbitrari.
 Per esempio None. Non riusciresti ad attaccargli sopra x.__error__.
 
 Questo e' un motivo duro per cui non si puo' fare. Ma ovviamente se si 
 fosse voluto fare si sarebbe potuto dotare qualunque oggetto di un attributo 
 __error__.

Si esatto. Intendevo un attributo di sistema e non di attributo appiccicato ad 
minchiam da me.

 
 Sulla parte pratica, credo che alla fine dei conti scrivere
 
 x = f()
 if x.__error__:
 ...
 
 non porti vantaggio rispetto ad altri modi di gestire l'errore. 
 
 Confronta con
 
 res, error = f()
 if error:
 ...

 
 e vedi che non e' che sia una miglioria enorme.

No certo. Mai pensato che lo fosse :D.

 
 Inoltre ci sono cose minori, tipo il fatto di dovere pagare sempre un 
 puntatore (o analogo) per ogni oggetto (quindi un consumo di memoria non 
 trascurabile), anche quelli che non ne avrebbero bisogno.
  
 Semmai la parte interessante potrebbe in qualche modo essere il concetto di 
 auto-propagare l'errore. Ovvero l'idea e' che se hai un __error__ in entrata 
 fai uscire qualcosa con un __error__. Questa strategia avrebbe comunque due 
 problemi abbastanza massicci:
 
 1. e' terribilmente implicita. temo si finirebbe con un problema che alla 
 fine ha un __error__ e non si sa perche' (a meno di non avere una strategia 
 molto complicata e molto costosa per accumulare gli errori
 
 2. in generale se hai un errore non sei in grado di darmi un oggetto che 
 abbia una parvenza di significato e appiccicargli __error__ non migliora 
 troppo le cose.
 
 Mi spiego... se mi fai un metodo che ritorna una lista, mi ritorni una lista 
 vuota con __error__ e la cosa funziona (mi distingue il caso in cui la lista 
 vuota e' il vero ritorno e mi costruisci un valore valido del tipo che vuoi 
 ritornare).
 
 Ma ci sono tipi che non hanno una lista vuota. Che so... un libro. Che 
 facciamo il libro vuoto? Cioe', in teoria si potrebbe creare un linguaggio 
 che funziona cosi'... alla fine dei conti si chiama NullObjectPattern (meno 
 il __error__) e in determinate circostanze e' buono.


Grazie Enrico  mi hai dato ottimi spunti di riflessione.
Ti devo una birra in più ;)

G

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python