Il n'y a pas de raison particulière . Python applique simplement son principe général de ne pas effectuer de conversions implicites, qui sont des causes bien connues de problèmes, en particulier pour les nouveaux venus, dans des langages tels que Perl et Javascript.
int(some_string)
est une demande explicite de conversion d'une chaîne au format entier; les règles de cette conversion spécifient que la chaîne doit contenir une représentation littérale entière valide. int(float)
est une demande explicite de conversion d'un flottant en entier; les règles de cette conversion spécifient que la partie fractionnaire du flottant sera tronquée.
Pour int("3.1459")
retourner, 3
l'interpréteur devrait implicitement convertir la chaîne en un flottant. Étant donné que Python ne prend pas en charge les conversions implicites, il choisit de lever une exception à la place.
type(3)
revient<type int>
. Cependant, python ne se plaint pasfloat("3")
. Python ne convertit-il pas implicitement la chaîne en un entier, puis en un flottant?C'est presque certainement un cas d'application de trois des principes du Zen de Python :
Un certain pourcentage du temps, quelqu'un
int('1.23')
appelle la mauvaise conversion pour son cas d'utilisation et veut quelque chose commefloat
ou à ladecimal.Decimal
place. Dans ces cas, il est clairement préférable pour eux d'obtenir une erreur immédiate qu'ils peuvent corriger, plutôt que de donner silencieusement la mauvaise valeur.Dans le cas où vous ne voulez tronquer que pour un entier, il est trivial de faire explicitement en passant à travers d'
float
abord, puis d' appeler l' un desint
,round
,trunc
,floor
ouceil
selon le cas. Cela rend également votre code plus auto-documenté, en vous protégeant contre une modification ultérieure "corrigeant" unint
appel hypothétique tronquant en silence enfloat
indiquant clairement que la valeur arrondie est ce que vous voulez.la source
Parfois, une expérience de pensée peut être utile.
int('1.23')
échoue avec une erreur. C'est le comportement existant.int('1.23')
produit1
sans erreur. C'est ce que vous proposez.Avec le comportement A, il est simple et trivial d'obtenir l'effet du comportement B: utilisez
int(float('1.23'))
plutôt.D'un autre côté, avec le comportement B, obtenir l'effet du comportement A est beaucoup plus compliqué:
def parse_pure_int(s): if "." in s: raise ValueError("invalid literal for integer with base 10: " + s) return int(s)
(et même avec le code ci-dessus, je ne suis pas totalement convaincu qu'il n'y a pas de cas d'angle que cela gêne.)
Le comportement A est donc plus expressif que le comportement B.
Une autre chose à considérer:
'1.23'
est une représentation sous forme de chaîne d'une valeur à virgule flottante. La conversion'1.23'
à un nombre entier implique conceptuellement deux conversions (chaîne à flotteur entier), maisint(1.23)
etint('1')
comprennent chacune une seule conversion.Éditer:
Et en effet, il y a des cas d'angle que le code ci-dessus ne gérerait pas:
1e-2
et1E-2
sont également des valeurs à virgule flottante.la source
int('123E-2')
ouint('1L')
.En termes simples, ce n'est pas la même fonction.
Ce sont 2 fonctions différentes avec le même nom qui renvoient un entier mais ce sont des fonctions différentes.
«int» est court et facile à retenir et sa signification appliquée à chaque type est intuitive pour la plupart des programmeurs, c'est pourquoi ils l'ont choisi.
Il n'y a aucune implication qu'ils fournissent la même fonctionnalité ou des fonctionnalités combinées, ils ont simplement le même nom et renvoient le même type. Ils pourraient aussi facilement être appelés «floorDecimalAsInt» et «convertStringToInt», mais ils ont opté pour «int» car il est facile à retenir, (99%) intuitif et la confusion se produirait rarement.
L'analyse du texte en tant qu'entier pour le texte qui incluait un point décimal tel que «4,5» générerait une erreur dans la majorité des langages informatiques et devrait générer une erreur par la majorité des programmeurs, car la valeur du texte ne représente pas un entier et implique ils fournissent des données erronées
la source
int
s'agit d'un type (et d'un type intégré en plus). Son créateur (__new__
) prend un certain nombre de types d'arguments possibles. Son comportement pour chaque type est bien défini.int
n'est en fait pas une fonction mais un type, dont les méthodes__new__
et__init__
prennent une chaîne ou un argument flottant, traitant chacun de manière appropriée. Il serait plus précis de dire que le type traite les deux types d'argument différemment, mais il n'y en a qu'unint
.