Hoe controleer ik of een variabele een geheel getal is?
Als u dit moet doen, doe dan
isinstance(<var>, int)
tenzij je in Python 2.x bent, in welk geval je
isinstance(<var>, (int, long))
Gebruik type
niet. Het is bijna nooit het juiste antwoord in Python, omdat het alle flexibiliteit van polymorfisme blokkeert. Bijvoorbeeld, als je int
subklasseert, moet je nieuwe klasse zich registreren als een int
, wat type
niet zal doen:
class Spam(int): pass
x = Spam(0)
type(x) == int # False
isinstance(x, int) # True
Dit is in overeenstemming met Python's sterke polymorfisme: je moet elk object toestaan dat zich gedraagt als een int
, in plaats van te eisen dat het een int
is.
De klassieke Python-mentaliteit is echter dat het's gemakkelijker is om vergeving te vragen dan toestemming. Met andere woorden, controleer niet of x
een integer is; neem aan dat het dat is en vang de exception resultaten op als het dat niet is:
try:
x += 1
except TypeError:
...
Deze mentaliteit wordt langzaam ingehaald door het gebruik van abstracte basisklassen, waarmee je precies kunt vastleggen welke eigenschappen je object moet hebben (optellen? vermenigvuldigen? verdubbelen?) door het te laten erven van een speciaal geconstrueerde klasse. Dat zou de beste oplossing zijn, omdat het exact die objecten met de nodige en voldoende attributen zal toelaten, maar je zal de docs moeten lezen over hoe het te gebruiken.
>>> isinstance(3, int)
True
Zie hier voor meer.
Merk op dat dit niet helpt als je'op zoek bent naar int
-achtige attributen. In dat geval wil je misschien ook controleren op long
:
>>> isinstance(3L, (long, int))
True
Ik'heb dit soort controles tegen een array/index type in de Python bron gezien, maar ik denk niet'dat dat buiten C zichtbaar is.
Token SO reply: Weet je zeker dat je het type moet controleren? Ofwel geef geen type door waar je niet mee om kunt gaan, of probeer je potentiële code hergebruikers niet te slim af te zijn, ze kunnen een goede reden hebben om geen int aan je functie door te geven.
Vond een gerelateerde vraag hier op SO zelf.
Python ontwikkelaars controleren liever geen types maar doen een type specifieke bewerking en vangen een TypeError
exception op. Maar als je'het type niet weet dan heb je het volgende.
>>> i = 12345
>>> type(i)
<type 'int'>
>>> type(i) is int
True