Não consigo entender por que o Python não tem uma sign
função. Ele tem um abs
builtin (que eu considero sign
a irmã de), mas nãosign
.
No python 2.6 há até uma copysign
função (em matemática ), mas nenhum sinal. Por que se preocupar em escrever um copysign(x,y)
quando você pode simplesmente escrever um sign
e depois obter o copysign
diretamente abs(x) * sign(y)
? O último seria muito mais claro: x com o sinal de y, enquanto no copysign você deve se lembrar se é x com o sinal de y ou y com o sinal de x!
Obviamente sign(x)
, não fornece nada além disso cmp(x,0)
, mas seria muito mais legível que isso também (e para uma linguagem muito legível como python, isso seria uma grande vantagem).
Se eu fosse um designer de python, seria o contrário: não cmp
embutido, mas a sign
. Quando você precisar cmp(x,y)
, você pode simplesmente fazer um sign(x-y)
(ou, melhor ainda, para coisas não numéricas, apenas um x> y - é claro que isso deveria exigir a sorted
aceitação de um booleano em vez de um comparador inteiro). Isso também ficaria mais claro: positivo quando x>y
(considerando que cmp
você deve se lembrar da convenção positiva quando o primeiro for maior , mas pode ser o contrário). É claro que cmp
faz sentido por outras razões (por exemplo, ao classificar coisas não numéricas, ou se você deseja que a classificação seja estável, o que não é possível usando simplesmente com um booleano)
Então, a pergunta é: por que os designers de Python decidiram deixar a sign
função fora da linguagem? Por que diabos se incomoda com copysign
e não com seus paissign
?
Estou esquecendo de algo?
EDIT - após o comentário de Peter Hansen. É justo o suficiente que você não o tenha usado, mas não disse para que usa o python. Em 7 anos que uso python, precisei inúmeras vezes, e o último é o canudo que quebrou as costas do camelo!
Sim, você pode passar o cmp por aí, mas 90% das vezes que eu precisava passá-lo estavam em um idioma como
lambda x,y: cmp(score(x),score(y))
aquele que funcionaria bem com o sinal.
Finalmente, espero que você concorde que isso sign
seria mais útil do que copysign
, mesmo que eu comprei sua opinião, por que se preocupar em definir isso em matemática, em vez de assinar? Como o copysign pode ser tão útil quanto assinar?