Parfois, une expérience de pensée peut être utile.
- Le comportement d'Un:
int('1.23')
échoue avec une erreur. C'est le comportement existant.
- Le comportement de B:
int('1.23')
produit 1
sans erreur. C'est ce que vous proposez.
Avec Un comportement, il est simple et trivial pour obtenir l'effet de comportement B: int(float('1.23'))
à la place.
D'autre part, avec un comportement B, l'obtention de l'effet du comportement de l'Un est nettement 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 n'ai pas une totale confiance qu'il n'y a pas un coin de cas qu'il traite mal.)
Le comportement d'Un, par conséquent, est plus expressif que le comportement de B.
Une autre chose à considérer: '1.23'
est une représentation de chaîne de valeur à virgule flottante. Convertir '1.23'
pour un entier sur le plan conceptuel implique deux conversions (chaîne de flotter en entier), mais int(1.23)
et int('1')
chaque impliquer une seule conversion.
Edit:
Et en effet, il existe des cas limites que le code ci-dessus ne serait pas de poignée: 1e-2
et 1E-2
sont à la fois des valeurs à virgule flottante.