Non riesco a capire perché Python non abbia una sign
funzione. Ha un abs
builtin (che considero sign
la sorella), ma no sign
.
In python 2.6 c'è anche una copysign
funzione (in matematica ), ma nessun segno. Perché preoccuparsi di scrivere un copysign(x,y)
quando si potrebbe semplicemente scrivere un sign
e quindi ottenere copysign
direttamente da abs(x) * sign(y)
? Quest'ultimo sarebbe molto più chiaro: x con il segno di y, mentre con copysign devi ricordare se è x con il segno di y o y con il segno di x!
Ovviamente sign(x)
non fornisce nulla di più cmp(x,0)
, ma sarebbe molto più leggibile anche questo (e per un linguaggio molto leggibile come Python, questo sarebbe stato un grande vantaggio).
Se fossi un designer di pitone, sarei il contrario: nessun cmp
builtin, ma a sign
. Quando ne hai bisogno cmp(x,y)
, potresti semplicemente fare un sign(x-y)
(o, ancora meglio, per cose non numeriche, solo un x> y - ovviamente questo avrebbe dovuto sorted
accettare un valore booleano invece di un comparatore intero). Questo sarebbe anche più chiaro: positivo quando x>y
(mentre con cmp
te devi ricordare la convenzione positiva quando il primo è più grande , ma potrebbe essere il contrario). Naturalmente cmp
ha senso per altri motivi (ad esempio quando si ordinano cose non numeriche o se si desidera che l'ordinamento sia stabile, cosa impossibile con un semplice valore booleano)
Quindi, la domanda è: perché i designer Python hanno deciso di lasciare la sign
funzione fuori dal linguaggio? Perché diavolo preoccuparsi copysign
e non dei suoi genitori sign
?
Mi sto perdendo qualcosa?
EDIT - dopo il commento di Peter Hansen. Abbastanza giusto da non averlo usato, ma non hai detto per cosa usi Python. In 7 anni che uso Python, ne avevo bisogno innumerevoli volte, e l'ultima è la goccia che ha spezzato la schiena del cammello!
Sì, puoi passare cmp in giro, ma il 90% delle volte che ho dovuto passare era in un idioma del genere
lambda x,y: cmp(score(x),score(y))
avrebbe funzionato con il segno bene.
Infine, spero che tu sia d'accordo sul fatto che sign
sarebbe più utile di copysign
, quindi anche se avessi acquistato il tuo punto di vista, perché preoccuparsi di definirlo in matematica, invece di firmare? Come può copysign essere così utile che firmare?