Sprawdzanie, czy zmienna jest liczbą całkowitą czy nie

Jak sprawdzić, czy zmienna jest liczbą całkowitą?

Rozwiązanie

Jeśli musisz to zrobić, zrób

isinstance(, int)

chyba że pracujesz w Pythonie 2.x, w którym to przypadku chcesz

isinstance(, (int, long))

Nie należy używać type. To prawie nigdy nie jest właściwa odpowiedź w Pythonie, ponieważ blokuje całą elastyczność polimorfizmu. Na przykład, jeśli podklasujesz int, twoja nowa klasa powinna zarejestrować się jako int, czego type nie zrobi:

class Spam(int): pass
x = Spam(0)
type(x) == int # False
isinstance(x, int) # True

Jest to zgodne z silnym polimorfizmem Pythona: powinieneś pozwolić na dowolny obiekt, który zachowuje się jak int, zamiast nakazać, aby był jednym z nich.

BUT

Klasyczną mentalnością Pythona jest to, że łatwiej jest prosić o wybaczenie niż o pozwolenie. Innymi słowy, nie sprawdzaj, czy x jest liczbą całkowitą; załóż, że jest i złap wynik wyjątku, jeśli nie jest:

try:
    x += 1
except TypeError:
    ...

Ta mentalność jest powoli wypierana przez użycie abstrakcyjnych klas bazowych, które pozwalają zarejestrować dokładnie, jakie właściwości powinien mieć nasz obiekt (dodawanie? mnożenie? podwajanie?) poprzez dziedziczenie po specjalnie skonstruowanej klasie. Byłoby to najlepsze rozwiązanie, ponieważ pozwoli na dokładnie te obiekty z niezbędnymi i wystarczającymi atrybutami, ale będziesz musiał przeczytać dokumenty, jak z tego korzystać.

Komentarze (14)
>>> isinstance(3, int)
True

Zobacz tutaj, aby dowiedzieć się więcej.

Zauważ, że to nie pomaga, jeśli'szukasz atrybutów int-like. W tym przypadku możesz również chcieć sprawdzić dla long:

>>> isinstance(3L, (long, int))
True

I've seen checks of this kind against an array/index type in the Python source, but I don't think that's visible outside of C.

Token SO odpowiedź: Czy na pewno powinieneś sprawdzić jego typ? Albo nie przekazuj typu, którego nie możesz'obsłużyć, albo nie próbuj przechytrzyć swoich potencjalnych reużytkowników kodu, mogą mieć dobry powód, aby nie przekazywać int do swojej funkcji.

Komentarze (8)

Znalazłem powiązane pytanie tutaj na samym SO.

Programiści Pythona wolą nie sprawdzać typów, ale wykonać operację specyficzną dla typu i złapać wyjątek TypeError. Ale jeśli nie'znasz typu, wtedy masz następujące.

>>> i = 12345
>>> type(i)

>>> type(i) is int
True
Komentarze (3)