Es ist wirklich erstaunlich, dass eine so hitzige Diskussion aufkommt, wenn eine so grundlegende, gültige und, wie ich glaube, banale Frage gestellt wird.
einige Leute haben darauf hingewiesen, dass die Typüberprüfung gegen int
(und long
) könnte in Fällen, in denen eine große Dezimalzahl auftritt, verloren gehen. ganz richtig.
einige Leute haben darauf hingewiesen, dass man "einfach tun sollte x + 1
und sehen Sie, ob das scheitert. Nun, zum einen funktioniert das auch bei Floats, und zum anderen ist es einfach, eine Klasse zu konstruieren, die definitiv nicht sehr numerisch ist, aber die +
Operator in irgendeiner Form.
Ich bin im Widerspruch zu vielen Beiträgen, die energisch erklären, dass man nicht nach Typen suchen sollte. Nun, GvR sagte einmal etwas in der Richtung, dass dies in der reinen Theorie richtig sein mag, aber in der Praxis, isinstance
dient oft einem nützlichen Zweck (das ist schon eine Weile her, ich habe den Link nicht mehr; Sie können lesen, was GvR über verwandte Themen sagt in Beiträge wie dieser hier ).
lustig ist, wie viele Leute anscheinend davon ausgehen, dass die Absicht des Auftraggebers darin bestand, zu prüfen, ob die Typ einer bestimmten x
ist ein numerischer Integer-Typ - was ich verstanden habe, ist das, was ich normalerweise meine, wenn ich die Worte des Auftraggebers verwende: ob x
repräsentiert eine ganze Zahl. Und das kann sehr wichtig sein: Wenn Sie jemanden fragen, wie viele Artikel er auswählen möchte, möchten Sie vielleicht sicherstellen, dass Sie eine nicht-negative ganze Zahl zurückbekommen. solche Anwendungsfälle gibt es zuhauf.
Meiner Meinung nach ist es auch wichtig zu sehen, dass (1) Typüberprüfung nur EIN - und oft ziemlich grobes - Maß für die Korrektheit eines Programms ist, weil (2) es oft begrenzte Werte sind, die Sinn machen, und Werte außerhalb der Grenzen, die Unsinn machen. Manchmal machen nur einige intermittierende Werte Sinn - wie wenn man alle Zahlen betrachtet, nur die reellen (nicht-komplexen), ganzzahligen Zahlen könnten in einem bestimmten Fall möglich sein.
Seltsam, dass niemand zu erwähnen scheint, dass man nach x == math.floor( x )
. wenn das sollte ein Fehler mit einigen großen Dezimal-Klasse, gut, dann vielleicht ist es Zeit, OOP-Paradigmen zu überdenken. es gibt auch PEP 357 die sich mit der Frage beschäftigt, wie man nicht so offensichtliche- int
-aber-bestimmt-ganzzahlige Werte als Listenindizes verwendet werden. nicht sicher, ob ich die Lösung mag.
0 Stimmen
@katrielalex: Wenn er meine Antwort als die richtige gewählt hat, bedeutet das nicht, dass Hulk den von Ihnen erwähnten Eindruck hatte. Es gibt auch die
ValueError
Ausnahmemöglichkeit, die VOR dertype()
.0 Stimmen
@Hulk: Ich will wirklich nicht dafür werben, dass Sie meine Antwort akzeptieren - Sie können sie gerne an Ashish zurückgeben; er hat eine absolut gültige und technisch korrekte Antwort gegeben. Ich wollte nur sicherstellen, dass Sie auch den Rest der Ratschläge auf dieser Seite gelesen haben.
0 Stimmen
@katrielalex: Ashish hatte Recht, aber die Kodierungsszenarien brauchten die Ausnahmeklausel, und so habe ich meine Antwort geändert, nichts für ungut, Ashish.
2 Stimmen
@Hulk: Nicht böse gemeint. Aber um das klarzustellen, der einzige Weg, wie man eine Ausnahme abfangen kann (soweit ich weiß), ist die Verwendung einer Ausnahmeklausel. Ich habe vorgeschlagen, dass Sie die
TypeError
Ausnahme.20 Stimmen
Diese Frage ist zweideutig, und die Antworten sind entsprechend geteilt. Einige antworten darauf, wie man den Typ einer Variablen überprüft (5True, 5.0 False), während andere darauf antworten, wie man überprüft, dass der Wert eine ganze Zahl ist (5True, 5.0True, Fraction(5,1)True, 5.4False). Vielleicht sollten die Frage und die Antworten entsprechend aufgeteilt werden?
0 Stimmen
@S.Lott - Ich möchte meine Ausgabe formatieren, mit "{:03.2e}".format(value) für Fließkommazahlen und str(value) für Ganzzahlen.
0 Stimmen
Verwandt: stackoverflow.com/questions/21583758/
0 Stimmen
@S.Lott - es gibt einen sehr triftigen Grund dafür - wenn Sie Tests schreiben und prüfen, ob Ihr Wert tatsächlich Integer ist und wo assertIsNone die Bedingung, die Sie testen möchten, nicht testen würde.
0 Stimmen
Das ist eine völlig berechtigte Frage. Beispiel: Sie verarbeiten Daten in Stapeln, und der Erhalt einer nicht ganzzahligen Zahl in einer Zeile führt dazu, dass der gesamte Stapel in einer späteren Phase fehlschlägt. Sie möchten das Problem erkennen, bevor eine Ausnahme ausgelöst wird (und möglicherweise Ihre eigene Ausnahme auslösen).
1 Stimmen
Der einfachste Weg (der in Python 2.7.11 funktioniert) ist int(var) == var. Funktioniert mit .0 Floats und liefert boolean.
2 Stimmen
Meinen Sie "Wie stelle ich fest, ob der Typ einer Variablen eine ganze Zahl ist?" oder "Wie stelle ich fest, ob der Wert einer Variablen eine ganze Zahl ist?"