Manchmal kann ein Gedankenexperiment nützlich sein.
- Verhalten A:
int('1.23')schlägt mit einem Fehler fehl. Dies ist das vorhandene Verhalten.
- Verhalten B:
int('1.23')erzeugt 1fehlerfrei. Das schlagen Sie vor.
Mit Verhalten A ist es einfach und trivial, die Wirkung von Verhalten B zu erzielen: Verwenden Sie int(float('1.23'))stattdessen.
Andererseits ist es bei Verhalten B wesentlich komplizierter, die Wirkung von Verhalten A zu erhalten:
def parse_pure_int(s):
if "." in s:
raise ValueError("invalid literal for integer with base 10: " + s)
return int(s)
(Und selbst mit dem obigen Code habe ich nicht das volle Vertrauen, dass es keinen Eckfall gibt, den es falsch behandelt.)
Verhalten A ist daher ausdrucksvoller als Verhalten B.
Eine andere zu berücksichtigende Sache: '1.23'ist eine Zeichenfolgendarstellung eines Gleitkommawertes. Umwandlung '1.23'in eine Ganzzahl umfasst konzeptionell zwei Konvertierungen (string schweben zu integer), sondern int(1.23)und int('1')jeweils beinhalten nur eine Umwandlung.
Bearbeiten:
In der Tat gibt es Eckfälle, die der obige Code nicht behandeln würde: 1e-2und 1E-2beide sind auch Gleitkommawerte.
type(3)kehrt zurück<type int>. Python beschwert sich jedoch nichtfloat("3"). Konvertiert Python den String nicht implizit in einen Int und dann in einen Float?