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ć isinstance
z liczbami Numer - abstrakcyjna klasa bazowa (ABC), która istnieje dokładnie w tym celu (w collections
module 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ć 0
i 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 unregister
metody [[na przykład możesz stworzyć własne ABC WeirdNum
i zarejestrować tam wszystkie takie dziwne dla ciebie typy, a następnie najpierw sprawdzić, czy isinstance
wyskoczysz, zanim przejdziesz dalej sprawdzanie isinstance
normalności, numbers.Number
aby kontynuować pomyślnie.
BTW, jeśli i kiedy chcesz sprawdzić, czy x
moż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 ZeroDivisionError
lub 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 ... ;-).