Annak ellenőrzése, hogy egy változó egész szám-e vagy sem

Hogyan ellenőrizhetem, hogy egy változó egész szám-e?

Megoldás

Ha erre van szükség, tegye meg

isinstance(, int)

kivéve, ha Python 2.x-et használsz, amely esetben azt akarod, hogy a

isinstance(, (int, long))

Ne használd a type-t. Ez szinte soha nem a helyes válasz Pythonban, mivel blokkolja a polimorfizmus minden rugalmasságát. Ha például az int alosztályba sorolod, az új osztályodnak int-ként kell regisztrálnia, amit a type nem fog megtenni:

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

Ez betartja a Python'erős polimorfizmusát: bármilyen objektumot engedélyezned kell, ami úgy viselkedik, mint egy int, ahelyett, hogy kötelezővé tennéd, hogy az legyen.

BUT

A klasszikus Python mentalitás szerint azonban könnyebb bocsánatot kérni, mint engedélyt. Más szóval, ne ellenőrizzük, hogy x egész szám-e; feltételezzük, hogy az, és kapjuk el a kivétel eredményét, ha nem az:

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

Ezt a mentalitást lassan felülírja az absztrakt alaposztályok használata, amelyek lehetővé teszik, hogy pontosan regisztráld, milyen tulajdonságokkal kell rendelkeznie az objektumodnak (összeadás? szorzás? duplázás?), azáltal, hogy egy speciálisan felépített osztályból örökli. Ez lenne a legjobb megoldás, mivel pontosan azokat az objektumokat engedi meg, amelyek rendelkeznek a szükséges és elégséges tulajdonságokkal, de el kell olvasnod a dokumentációt a használatáról.

Kommentárok (14)
>>> isinstance(3, int)
True

További részletekért lásd itt.

Vegye figyelembe, hogy ez nem segít, ha int-szerű attribútumokat keres. Ebben az esetben érdemes lehet a long-t is ellenőrizni:

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

Én'láttam ilyen típusú ellenőrzéseket egy tömb/index típus ellen a Python forrásban, de nem hiszem, hogy ez'a C nyelven kívül látható.

Token SO válasz: Biztos, hogy a típusát kell ellenőrizni? Vagy ne adj át olyan típust, amit nem tudsz kezelni, vagy ne próbáld túljárni a potenciális kód újrafelhasználóid eszén, lehet, hogy jó okuk van arra, hogy ne adjanak át int-et a függvényednek.

Kommentárok (8)

Találtam egy kapcsolódó kérdést itt a SO-n.

A Python fejlesztők inkább nem ellenőrzik a típusokat, hanem egy típus specifikus műveletet végeznek, és elkapnak egy TypeError kivételt. De ha nem tudod a típust'akkor a következőket.

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

>>> type(i) is int
True
Kommentárok (3)