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 isinstancemit 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 0und 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 unregisterMethode haben [[zum Beispiel könnten Sie Ihr eigenes ABC erstellen WeirdNumund dort all diese für Sie seltsamen Typen registrieren, und dann zuerst prüfen, ob isinstancesie gerettet werden, bevor Sie fortfahren um nach isinstancedem Normalen numbers.Numberzu suchen , um erfolgreich fortzufahren.
Übrigens, wenn Sie prüfen müssen, ob etwas möglich xist 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 ZeroDivisionErroroder "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 ... ;-).