Sie möchten überprüfen, ob ein Objekt vorhanden ist
verhält sich unter bestimmten Umständen wie eine Zahl
Wenn Sie Python 2.5 oder älter verwenden, besteht die einzige Möglichkeit darin, einige dieser "bestimmten Umstände" zu überprüfen und zu überprüfen.
In 2.6 oder besser können Sie isinstance
mit numbers.Number verwenden - eine abstrakte Basisklasse (ABC), die genau für diesen Zweck existiert (es gibt viel mehr ABCs in dercollections
Modul für verschiedene Arten von Sammlungen / Containern, wiederum beginnend mit 2.6; und, Auch nur in diesen Releases können Sie bei Bedarf problemlos Ihre eigenen abstrakten Basisklassen hinzufügen.
Bach bis 2.5 und früher, "kann hinzugefügt werden 0
und ist nicht iterierbar", könnte in einigen Fällen eine gute Definition sein. Aber, die Sie wirklich brauchen , sich zu fragen, was es ist , dass Sie fragen, was Sie „eine Reihe“ betrachten wollen definitiv in der Lage sein müssen , zu tun , und was es muss absolut sein nicht in der Lage zu tun - und überprüfen.
Dies kann auch in Version 2.6 oder höher erforderlich sein, um möglicherweise eigene Registrierungen vorzunehmen, um Typen hinzuzufügen, für die Sie sich interessieren und die noch nicht registriert sind numbers.Numbers
- wenn Sie einige Typen ausschließen möchten, die behaupten, sie seien Zahlen, aber Sie kann einfach nicht damit umgehen, das ist noch sorgfältiger, da ABCs keine unregister
Methode haben [[zum Beispiel könnten Sie Ihr eigenes ABC erstellen WeirdNum
und dort all diese für Sie seltsamen Typen registrieren, und dann zuerst prüfen, ob isinstance
sie gerettet werden, bevor Sie fortfahren um nach isinstance
dem Normalen numbers.Number
zu suchen , um erfolgreich fortzufahren.
Übrigens, wenn Sie prüfen müssen, ob etwas möglich x
ist oder nicht, müssen Sie im Allgemeinen Folgendes ausprobieren:
try: 0 + x
except TypeError: canadd=False
else: canadd=True
Das Vorhandensein von __add__
per se sagt Ihnen nichts Nützliches, da z. B. alle Sequenzen es zum Zwecke der Verkettung mit anderen Sequenzen haben. Diese Prüfung entspricht beispielsweise der Definition "Eine Zahl ist so, dass eine Folge solcher Dinge ein gültiges Einzelargument für die eingebaute Funktion ist sum
". Völlig seltsame Typen (z. B. solche, die die "falsche" Ausnahme auslösen, wenn sie auf 0 summiert werden, wie z. B. a ZeroDivisionError
oder "nicht iterierbar sein") (z. B. überprüfen, ob dies ausgelöst wird , oder auf das Vorhandensein einer speziellen Methode - wenn Sie in 2.5 oder früher sind und daher Ihre eigenen Schecks benötigen).ValueError
& c) verbreiten eine Ausnahme, aber das ist in Ordnung. Lassen Sie den Benutzer so schnell wie möglich wissen, dass solche verrückten Typen im Guten einfach nicht akzeptabel sind Unternehmen;-); Aber ein "Vektor", der zu einem Skalar summierbar ist (Pythons Standardbibliothek hat keinen, aber natürlich sind sie als Erweiterungen von Drittanbietern beliebt), würde hier auch das falsche Ergebnis liefern, also (ziter(x)
TypeError
__iter__
Ein kurzer Blick auf solche Komplikationen kann ausreichen, um Sie zu motivieren, sich nach Möglichkeit auf abstrakte Basisklassen zu verlassen ... ;-).