Was ist die pythischste Art zu überprüfen, ob ein Objekt eine Zahl ist?
Gegeben eine beliebige python-Objekt, was ist der beste Weg, um zu bestimmen, ob es eine Zahl ist? Hier is
ist definiert als acts like a number in certain circumstances
.
Angenommen, Sie schreiben eine vector-Klasse. Wenn gegeben, ein Vektor, den Sie finden wollen, das Skalarprodukt. Wenn da ein Skalar, die Sie skalieren möchten den ganzen Vektor.
Prüfen, ob etwas int
, float
, long
, bool
ist ärgerlich und nicht gerade user-defined objects, möglicherweise wirken Sie wie zahlen. Aber, die überprüfung für die __mul__
, zum Beispiel, ist nicht gut genug, weil die vector-Klasse, die ich gerade beschrieben definieren würde __mul__
, aber es wäre nicht die Art von Nummer, die ich will.
InformationsquelleAutor der Frage Claudiu | 2010-08-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden
Number
von dernumbers
Modul zum testenisinstance(n, Number)
(seit 2.6).Dies ist, natürlich, im Gegensatz zu duck-typing. Wenn Sie sind mehr besorgt darüber, wie ein Objekt wirkt sondern als das, was es ist, führen Ihre Operationen wie wenn Sie haben eine Reihe und verwenden Sie Ausnahmen von Ihnen sonst sagen.
InformationsquelleAutor der Antwort Steven Rumbalski
Sie wollen, um zu überprüfen, ob ein Objekt
Wenn Sie mit Python 2.5 oder älter, die einzige wirkliche Möglichkeit ist, zu überprüfen, einige dieser "bestimmten Umständen" und zu sehen.
In 2,6 oder besser, Sie nutzen kann
isinstance
mit zahlen.Anzahl -- eine abstrakte Basis-Klasse (ABC) , existiert genau für diesen Zweck (viel mehr Alphabeten existieren in dercollections
- Modul für verschiedene Formen von collections/Container, wieder beginnend mit 2.6; und auch nur in diesen Versionen können Sie leicht fügen Sie Ihre eigenen abstrakten Basis-Klassen, wenn Sie benötigen).Bach bis 2.5 und früher
"können Hinzugefügt werden, um
0
und ist nicht durchsuchbar" könnte eine gute definition in einigen Fällen. Aber,Sie wirklich brauchen, um sich zu Fragen, was es ist, dass Sie sich Fragen, was Sie wollen, zu prüfen, "Anzahl" muss definitiv in der Lage sein, um tun, und was muss es unbedingt sein nicht zu tun-und zu überprüfen.
Dies kann auch erforderlich sein, in 2.6 oder später, vielleicht mit der Absicht, Ihre eigenen Registrierungen hinzufügen-Typen, die Sie interessieren, die noch nicht bereits registriert auf
numbers.Numbers
- wenn Sie möchten ausschließen einige Typen, die behaupten, Sie zahlen, aber Sie können einfach nicht damit umgehen, das braucht noch mehr Pflege, als das ABC haben keineunregister
Methode [[Sie können zum Beispiel machen Sie Ihre eigenen ABC -WeirdNum
und registrieren dort alle so komisch-für-Sie-Typen, dann prüfen Sie, obisinstance
davon zu retten, bevor Sie fortfahren zu überprüfen fürisinstance
von der normalennumbers.Number
weiterhin erfolgreich.BTW, wenn und wenn Sie brauchen, um zu überprüfen, ob
x
können oder etwas nicht tun können, haben Sie in der Regel, um zu versuchen, so etwas wie:Anwesenheit von
__add__
per se sagt Sie nichts nützlich, da e.g alle Sequenzen haben es für die Zwecke der Verkettung mit anderen Sequenzen. Diese Prüfung entspricht der definition "eine Zahl etwas, so dass eine Sequenz von solchen Dingen ist eine gültige einzige argument der builtin-Funktionsum
", zum Beispiel. Total schräge Typen (z.B. diejenigen, die Erhöhung der "falsch" - Ausnahme, wenn deren Summe 0 ist, wie, sagen wir, einZeroDivisionError
oderValueError
&c) propagiert Ausnahme, aber das ist OK, damit der Benutzer wissen, so bald wie möglich, dass solche verrückten Typen sind einfach nicht akzeptabel in guter Gesellschaft; -), aber ein "Vektor" ist summierbare einen Skalar (Python-standard-Bibliothek nicht haben, aber natürlich sind Sie beliebt als third-party-extensions) auch das falsche Ergebnis hier, also (z.B.) diese Prüfung sollte kommen nach "darf nicht iterierbar" (z.B., überprüfen, dassiter(x)
wirftTypeError
oder für die Anwesenheit von speziellen Methode__iter__
-- wenn Sie in 2.5 oder früher und müssen daher Ihre eigenen Kontrollen).Einen kurzen Blick auf solche Komplikationen können ausreichend sein, um zu motivieren, Sie zu verlassen, statt auf abstrakten Basisklassen, Wann immer möglich...;-).
InformationsquelleAutor der Antwort Alex Martelli
Dies ist ein gutes Beispiel, wo Ausnahmen wirklich glänzen. Nur tun, was Sie tun würde, mit den numerischen Typen und fangen die
TypeError
aus alles andere.Aber offensichtlich nur überprüft, ob ein Betrieb funktioniert, ob es nicht Sinn macht! Die einzige wirkliche Lösung für die, die nie mischen Arten und immer genau wissen, was typeclass Ihre Werte gehören.
InformationsquelleAutor der Antwort Jochen Ritzel
Umformulieren Ihre Frage, die Sie versuchen, zu bestimmen, ob etwas eine Sammlung oder einen einzelnen Wert. Versuchen, um zu vergleichen, ob etwas ist ein Vektor oder eine Zahl ist äpfel mit Birnen vergleichen - ich kann ein Vektor von Zeichenketten oder zahlen, und ich kann eine einzelne Zeichenfolge oder einzelne Zahl. Sie sind daran interessiert, wie viele Sie haben (1 oder mehr), nicht was für ein Typ Sie eigentlich sind.
meine Lösung für dieses problem ist es, zu überprüfen, ob die Eingabe ist ein einzelner Wert oder eine Sammlung durch die überprüfung der Anwesenheit von
__len__
. Zum Beispiel:Oder, für die duck-typing-Ansatz, können Sie versuchen, die Iteration auf
foo
erste:Letztlich ist es einfacher zu testen, ob etwas ist der Vektor-wie als zu testen, ob etwas Skalar-like. Wenn Sie Werte unterschiedlicher Typen (z.B. string, numerisch, etc.) kommen durch, dann ist die Logik des Programms kann einige arbeiten - wie haben Sie am Ende versucht, sich zu vermehren eine Zeichenfolge einen numerischen Vektor in den ersten Platz?
InformationsquelleAutor der Antwort Gordon Bean
Multiplizieren Sie das Objekt durch null. Jede Zahl mal null ist null. Jedes andere Ergebnis bedeutet, dass das Objekt nicht in eine Zahl (einschließlich der Ausnahmen)
Verwendung von ISTZAHL so erhalten die folgende Ausgabe:
Ausgabe:
Wahrscheinlich gibt es einige nicht-Anzahl Objekte in der Welt, die definieren
__mul__
zu null zurückgeben, wenn multipliziert mit null, aber das ist eine extreme Ausnahme. Diese Lösung sollte sich auf alle normalen und sane - code, den Sie generieren/vorliegt.InformationsquelleAutor der Antwort shrewmouse
Wahrscheinlich ist es besser, es einfach zu tun die andere Weise herum: Sie prüfen, ob es ein Vektor. Wenn es ist, Sie tun eine dot-Produkt und in allen anderen Fällen können Sie versuchen die Skalare Multiplikation.
Überprüfung der für die vector ist einfach, da sollte es von der Vektor-Klasse Typ (oder übernommen). Man könnte auch einfach versuchen, den ersten zu tun, ein dot-Produkt, und wenn das fehlschlägt (= es war nicht wirklich ein Vektor), dann wieder fallen zu skalaren Multiplikation.
InformationsquelleAutor der Antwort sth
Nur auf.
Vielleicht können wir verwenden eine Kombination von isinstance und isdigit wie folgt vor, um herauszufinden, ob ein Wert eine Zahl (int, float, etc)
wenn isinstance(num1, int) oder isinstance(num1 , float) oder num1.isdigit():
InformationsquelleAutor der Antwort shadab.tughlaq
Zusammenfassen /bewerten die bestehenden Methoden:
(Ich kam hier durch diese Frage)
Code
InformationsquelleAutor der Antwort Martin Thoma
Für die hypothetische vector-Klasse:
Angenommen
v
ist ein Vektor, und wir vermehren es durchx
. Wenn es Sinn macht, sich zu vermehren ist jede Komponentev
durchx
wir wohl gemeint, dass so versuchen, dass zuerst. Wenn nicht, vielleicht kann man den Punkt? Ansonsten ist es eine Art Fehler.BEARBEITEN -- den code unten funktioniert nicht, weil
2*[0]==[0,0]
anstatt eineTypeError
. Ich lasse es, denn es war kommentierte auf.InformationsquelleAutor der Antwort Katriel
Ich hatte ein ähnliches Problem, bei der Umsetzung eine Art der Vektor-Klasse. Eine Möglichkeit zu prüfen, eine Zahl zu konvertieren, um, D. H. durch die Verwendung
Diese ablehnen sollten Fälle, in denen x nicht in eine Zahl umgewandelt werden; kann aber auch ablehnen, andere Arten von Zahl-wie Strukturen, die könnte gültig sein, zum Beispiel komplexe zahlen.
InformationsquelleAutor der Antwort Ant6n
Können Sie mit der isdigit () - Funktion.
InformationsquelleAutor der Antwort rsy