Parfois, une expérience de pensée peut être utile.
- Comportement A:
int('1.23')échoue avec une erreur. C'est le comportement existant.
- Comportement B:
int('1.23')produit 1sans 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), mais int(1.23)et int('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-2et 1E-2sont également des valeurs à virgule flottante.
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?