Je ne comprends pas pourquoi Python ne dispose pas d'une fonction sign
fonction. Il dispose d'un abs
builtin (que je considère comme sign
), mais pas de sign
.
Dans python 2.6, il existe même une fonction copysign
(en mathématiques ), mais aucun signe. Pourquoi prendre la peine d'écrire un copysign(x,y)
alors que vous pourriez simplement écrire un sign
et ensuite obtenir le copysign
directement de abs(x) * sign(y)
? Ce dernier serait beaucoup plus clair : x avec le signe de y, alors qu'avec copysign vous devez vous rappeler si c'est x avec le signe de y ou y avec le signe de x !
Évidemment sign(x)
ne fournit rien de plus que cmp(x,0)
mais il serait beaucoup plus lisible que cela aussi (et pour un langage très lisible comme python, cela aurait été un grand plus).
Si j'étais un concepteur de python, je serais dans l'autre sens : non cmp
mais un sign
. Lorsque vous avez besoin cmp(x,y)
vous pourriez simplement faire un sign(x-y)
(ou, encore mieux pour les choses non numériques, juste un x>y - bien sûr cela aurait dû nécessiter sorted
en acceptant un comparateur booléen au lieu d'un comparateur entier). Cela serait également plus clair : positif lorsque x>y
(alors qu'avec cmp
vous devez vous souvenir de la convention positive lorsque le primero es plus grand mais cela pourrait être l'inverse). Bien entendu cmp
a un sens en soi pour d'autres raisons (par exemple, lors du tri de choses non numériques, ou si vous voulez que le tri soit stable, ce qui n'est pas possible en utilisant simplement un booléen).
La question est donc la suivante : pourquoi le ou les concepteurs de Python ont-ils décidé de quitter l'entreprise ? sign
fonction hors de la langue ? Pourquoi s'embêter avec copysign
et non son parent sign
?
Est-ce que j'ai manqué quelque chose ?
EDIT - après le commentaire de Peter Hansen. C'est normal que vous ne l'utilisiez pas, mais vous n'avez pas dit à quoi vous utilisez python. En 7 ans d'utilisation de python, j'en ai eu besoin d'innombrables fois, et la dernière est la goutte d'eau qui a fait déborder le vase !
Oui, vous pouvez passer cmp, mais 90 % des fois où j'ai eu besoin de le faire, c'était dans un idiome tel que lambda x,y: cmp(score(x),score(y))
qui aurait très bien fonctionné avec le signe.
Enfin, j'espère que vous êtes d'accord pour dire que sign
serait plus utile que copysign
Donc, même si j'adhère à votre point de vue, pourquoi s'embêter à définir cela en mathématiques, au lieu du signe ? Comment le signe de copie peut-il être aussi utile que le signe ?
1 votes
"Est-ce que je rate quelque chose ?" Si rien d'autre, le fait d'utiliser
sign(x-y)
exige qu'une expression soit évaluée, ce qui signifie que vous ne pouvez pas la passer en tant que callback à moins de l'envelopper dans un "partial" d'abord. Avec cmp() tel qu'il est défini, vous passez simplement une référence àcmp
autour. Aussi "incroyablement utile" ? J'en doute. J'en ai eu besoin une fois en 10 ans d'écriture en Python. Si c'était vraiment si utile, je pense que ce serait là...43 votes
@dmazzoni : cet argument ne fonctionnerait-il pas pour toutes les questions sur ce site ? il suffit de fermer stackoverflow et de poser toutes les questions à la liste de diffusion pertinente des développeurs ou des utilisateurs !
2 votes
@davide : Premièrement je suis d'accord, une fonction signum est commune et utile. Deuxièmement, je suis d'accord avec dmazzoni pour dire que votre question est mieux posée sur python-dev. C'est une chose de demander comment utiliser une compréhension de liste pour faire xyz : nous pouvons faire un bon travail pour répondre à cela ici. Mais demander pourquoi Guido Van Rossum a laissé de côté signum est difficile à répondre pour quiconque ici.
54 votes
L'endroit approprié pour une question est tout endroit où il est probable qu'on y réponde. Ainsi, stackoverflow est un endroit approprié.
1 votes
@Davide, j'ai utilisé Python pour à peu près toutes les formes de logiciels qui existent, littéralement. Je ne travaille simplement pas exclusivement dans un domaine où sign() serait si utile. Vous semblez le faire ; les développeurs ne le font manifestement pas. Comme on l'a dit, si vous voulez vraiment la réponse, allez demander aux développeurs eux-mêmes où ils traînent, et vous aurez droit à une réponse claire.
25 votes
-1 : @Davide : Les questions "pourquoi" et "pourquoi pas" ne peuvent généralement pas être répondues ici. Puisque la plupart des principes du développement Python ne répondent pas aux questions ici, vous allez rarement (voire jamais) obtenir une réponse à une question "pourquoi" ou "pourquoi pas". De plus, vous n'avez pas de problème à résoudre. On dirait que vous avez un problème à résoudre. Si vous avez un problème ("Comment puis-je contourner l'absence de signe dans cet exemple..."), c'est raisonnable. "Pourquoi pas" n'est pas raisonnable pour ce lieu.
3 votes
Puisque vous demandez pourquoi quelqu'un a conçu quelque chose d'une manière particulière, pourquoi ne pas le demander directement au concepteur ? Essayer de faire spéculer les autres n'est pas particulièrement utile.
33 votes
La question est peut-être un peu émotive, mais je ne pense pas que ce soit une mauvaise question. Je suis sûr que de nombreuses personnes ont cherché une fonction de signe intégrée, et on peut donc se demander pourquoi il n'y en a pas.
22 votes
Il s'agit d'une question parfaitement objective : La question de savoir "pourquoi" Python ne dispose pas d'une fonctionnalité donnée est une question légitime sur l'histoire de la conception du langage à laquelle il est possible de répondre en créant un lien vers la discussion appropriée dans python-dev ou d'autres forums (parfois des articles de blog) où les développeurs du noyau de Python discutent de ce sujet. Ayant moi-même déjà essayé de chercher sur Google des éléments d'histoire dans python-dev, je peux comprendre pourquoi un nouveau venu dans le langage peut se retrouver dans une impasse et venir demander ici dans l'espoir qu'une personne plus expérimentée en Python lui réponde !