Chcesz sprawdzić, czy jakiś obiekt
w pewnych okolicznościach zachowuje się jak liczba
Jeśli używasz Pythona 2.5 lub starszego, jedynym prawdziwym sposobem jest sprawdzenie niektórych z tych „pewnych okoliczności” i zobaczenie.
W wersji 2.6 lub nowszej można używać isinstancez liczbami Numer - abstrakcyjna klasa bazowa (ABC), która istnieje dokładnie w tym celu (w collectionsmodule istnieje o wiele więcej ABC dla różnych form kolekcji / kontenerów, ponownie zaczynając od 2.6; oraz również tylko w tych wydaniach możesz łatwo dodać własne abstrakcyjne klasy bazowe, jeśli zajdzie taka potrzeba).
Bacha do 2.5 i wcześniejszych, „można dodać 0i nie jest iterowalne” może być w niektórych przypadkach dobrą definicją. Ale naprawdę musisz zadać sobie pytanie, co to jest, że pytasz, że to, co chcesz uznać za „liczbę”, musi zdecydowanie być w stanie zrobić , a czego absolutnie nie może zrobić - i sprawdzić.
Może to być również potrzebne w wersji 2.6 lub nowszej, być może w celu tworzenia własnych rejestracji w celu dodania typów, na których Ci zależy, a które nie zostały jeszcze zarejestrowane numbers.Numbers- jeśli chcesz wykluczyć niektóre typy, które twierdzą, że są numerami, ale ty po prostu nie mogę sobie z tym poradzić, to wymaga jeszcze większej ostrożności, ponieważ ABC nie ma unregistermetody [[na przykład możesz stworzyć własne ABC WeirdNumi zarejestrować tam wszystkie takie dziwne dla ciebie typy, a następnie najpierw sprawdzić, czy isinstancewyskoczysz, zanim przejdziesz dalej sprawdzanie isinstancenormalności, numbers.Numberaby kontynuować pomyślnie.
BTW, jeśli i kiedy chcesz sprawdzić, czy xmożesz lub nie możesz coś zrobić, generalnie musisz spróbować czegoś takiego:
try: 0 + x
except TypeError: canadd=False
else: canadd=True
Obecność __add__per se nie mówi nic użytecznego, ponieważ np. Wszystkie sekwencje mają je w celu połączenia z innymi sekwencjami. To sprawdzenie jest równoważne definicji „liczba jest czymś takim, że sekwencja takich rzeczy jest prawidłowym pojedynczym argumentem funkcji wbudowanej sum”. Całkowicie dziwne typy (np. Takie, które podnoszą „zły” wyjątek po zsumowaniu do 0, takie jak, powiedzmy, a ZeroDivisionErrorlub ValueError& c) będą propagować wyjątek, ale to jest w porządku, daj użytkownikowi jak najszybciej wiedzieć, że takie szalone typy są po prostu nie do przyjęcia w dobrym firma;-); ale „wektor”, który można podsumować jako skalar (standardowa biblioteka Pythona go nie ma, ale oczywiście są popularne jako rozszerzenia innych firm) również dałby tutaj zły wynik, więc (np.opcja „nie może być iterowalna” (np. sprawdź, czy iter(x)podbija TypeError, lub na obecność specjalnej metody __iter__- jeśli jesteś w 2.5 lub wcześniej i potrzebujesz własnych kontroli).
Krótkie spojrzenie na takie komplikacje może wystarczyć, aby zmotywować Cię do polegania na abstrakcyjnych klasach bazowych, gdy tylko jest to możliwe ... ;-).