Hogyan ellenőrizhetem, hogy egy változó egész szám-e?
Ha erre van szükség, tegye meg
isinstance(<var>, int)
kivéve, ha Python 2.x-et használsz, amely esetben azt akarod, hogy a
isinstance(<var>, (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.
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.
>>> 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.
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 'int'>
>>> type(i) is int
True