Es gibt keinen besonderen Grund. Python wendet einfach sein allgemeines Prinzip an, keine impliziten Konvertierungen durchzuführen, die bekannte Ursachen für Probleme sind, insbesondere für Neulinge, in Sprachen wie Perl und Javascript.
int(some_string)
ist eine explizite Anforderung zum Konvertieren einer Zeichenfolge in das Ganzzahlformat. Die Regeln für diese Konvertierung legen fest, dass die Zeichenfolge eine gültige Ganzzahl-Literaldarstellung enthalten muss. int(float)
ist eine explizite Anforderung zum Konvertieren eines Gleitkommas in eine Ganzzahl; Die Regeln für diese Konvertierung legen fest, dass der Bruchteil des Floats abgeschnitten wird.
Um int("3.1459")
zurückkehren zu können 3
, müsste der Interpreter den String implizit in einen Float konvertieren. Da Python keine impliziten Konvertierungen unterstützt, wird stattdessen eine Ausnahme ausgelöst.
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?Dies ist mit ziemlicher Sicherheit ein Fall, in dem drei der Prinzipien aus dem Zen von Python angewendet werden :
In einigen Prozent der
int('1.23')
Fälle ruft jemand die falsche Konvertierung für seinen Anwendungsfall auf und möchte so etwas wiefloat
oderdecimal.Decimal
stattdessen. In diesen Fällen ist es eindeutig besser, einen sofortigen Fehler zu erhalten, den sie beheben können, als stillschweigend den falschen Wert anzugeben.Im Fall , dass Sie es zu truncate möchten , dass in einen int, es trivial ist es explizit tun, indem sie durch den
float
ersten und dann einer der Aufrufint
,round
,trunc
,floor
oderceil
nach Bedarf. Dies macht auch Ihren Code selbsterklärend, gegen eine spätere Änderung Bewachung „Korrektur“ eine hypothetische leise beschneidendenint
Anruf an ,float
indem es klar , dass der gerundete Wert ist , was Sie wollen.quelle
Manchmal kann ein Gedankenexperiment nützlich sein.
int('1.23')
schlägt mit einem Fehler fehl. Dies ist das vorhandene Verhalten.int('1.23')
erzeugt1
fehlerfrei. 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:
(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), sondernint(1.23)
undint('1')
jeweils beinhalten nur eine Umwandlung.Bearbeiten:
In der Tat gibt es Eckfälle, die der obige Code nicht behandeln würde:
1e-2
und1E-2
beide sind auch Gleitkommawerte.quelle
int('123E-2')
oderint('1L')
.In einfachen Worten - sie sind nicht die gleiche Funktion.
Es handelt sich um zwei verschiedene Funktionen mit demselben Namen , die eine Ganzzahl zurückgeben, es handelt sich jedoch um verschiedene Funktionen.
'int' ist kurz und leicht zu merken und seine Bedeutung für jeden Typ ist für die meisten Programmierer intuitiv, weshalb sie es gewählt haben.
Es gibt keine Implikation, dass sie dieselbe oder kombinierte Funktionalität bereitstellen. Sie haben einfach denselben Namen und geben denselben Typ zurück. Sie könnten genauso gut als "floorDecimalAsInt" und "convertStringToInt" bezeichnet werden, aber sie entschieden sich für "int", weil es leicht zu merken ist, (99%) intuitiv und Verwirrung selten auftreten würde.
Das Parsen von Text als Ganzzahl für Text, der einen Dezimalpunkt wie "4.5" enthält, würde in den meisten Computersprachen einen Fehler auslösen und von den meisten Programmierern einen Fehler auslösen, da der Textwert keine Ganzzahl darstellt und impliziert Sie liefern fehlerhafte Daten
quelle
int
es sich um einen Typ handelt (und noch dazu um einen eingebauten). Sein Schöpfer (__new__
) verwendet eine Reihe möglicher Argumenttypen. Das Verhalten für jeden Typ ist genau definiert.int
ist in der Tat keine Funktion, sondern ein Typ, dessen__new__
und__init__
Methoden ein String- oder Float-Argument verwenden und mit jedem angemessen umgehen. Es wäre genauer zu sagen, dass der Typ die beiden Argumenttypen unterschiedlich verarbeitet, aber es gibt nur einenint
.