Wenn Sie dies tun müssen, tun Sie
isinstance(<var>, int)
es sei denn, Sie arbeiten mit Python 2.x. In diesem Fall sollten Sie
isinstance(<var>, (int, long))
Nicht verwenden type
. Das ist in Python fast nie die richtige Antwort, da es die ganze Flexibilität der Polymorphie blockiert. Wenn Sie zum Beispiel eine Unterklasse int
sollte sich Ihre neue Klasse als int
die type
nicht ausreichen wird:
class Spam(int): pass
x = Spam(0)
type(x) == int # False
isinstance(x, int) # True
Dies entspricht dem starken Polymorphismus von Python: Sie sollten jedes Objekt erlauben, das sich wie ein int
anstatt eine solche vorzuschreiben.
BUT
Die klassische Python-Mentalität ist jedoch, dass es es ist einfacher, um Vergebung zu bitten als um Erlaubnis . Mit anderen Worten: Prüfen Sie nicht, ob x
eine ganze Zahl ist; nehmen Sie an, dass dies der Fall ist und fangen Sie die Ausnahmeergebnisse ab, wenn dies nicht der Fall ist:
try:
x += 1
except TypeError:
...
Diese Mentalität wird langsam durch die Verwendung von abstrakte Basisklassen die es Ihnen ermöglichen, genau zu registrieren, welche Eigenschaften Ihr Objekt haben soll (Addieren? Multiplizieren? Verdoppeln?), indem Sie es von einer speziell konstruierten Klasse erben lassen. Das wäre die beste Lösung, da sie Folgendes ermöglicht genau diese Objekte mit den notwendigen und hinreichenden Attributen, aber Sie müssen in den Dokumenten nachlesen, wie sie zu verwenden sind.
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?"