Sen tarkistaminen, onko muuttuja kokonaisluku vai ei

Miten tarkistan, onko muuttuja kokonaisluku?

Ratkaisu

Jos sinun on tehtävä tämä, tee

isinstance(, int)

ellet ole Python 2.x:ssä, jolloin haluat

isinstance(, (int, long))

Älä käytä type. Se ei ole lähes koskaan oikea vastaus Pythonissa, koska se estää kaiken polymorfismin joustavuuden. Jos esimerkiksi aliluokka int on aliluokka, uuden luokkasi pitäisi rekisteröityä int-luokaksi, mitä type ei tee:

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

Tämä noudattaa Pythonin vahvaa polymorfismia: sinun pitäisi sallia mikä tahansa objekti, joka käyttäytyy kuin int, sen sijaan, että velvoittaisit sen olemaan sellainen.

BUT

Klassinen Python-mentaliteetti on kuitenkin se, että on helpompaa pyytää anteeksiantoa kuin lupaa. Toisin sanoen, älä tarkista, onko x kokonaisluku, vaan oleta, että se on, ja ota kiinni poikkeustulokset, jos se ei ole:

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

Tämä ajattelutapa on hitaasti ohitettu abstraktien perusluokkien käytöllä, joiden avulla voit rekisteröidä tarkalleen, mitä ominaisuuksia objektillasi pitäisi olla (yhteenlasku? kertolasku? kaksinkertaistaminen?) tekemällä sen periytyväksi erikoisrakenteisesta luokasta. Se olisi paras ratkaisu, koska se sallii tarkasti ne objektit, joilla on tarvittavat ja riittävät ominaisuudet, mutta sinun on luettava dokumentit sen käytöstä.

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

Katso lisätietoja täältä.

Huomaa, että tämä ei auta, jos etsit int-tyyppisiä attribuutteja. Tällöin saatat haluta tarkistaa myös long-ominaisuuden:

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

Olen nähnyt tämäntyyppisiä tarkistuksia array/index-tyyppiä vastaan Python-lähteessä, mutta en usko, että se näkyy C:n ulkopuolella.

Token SO vastaus: Oletko varma, että sinun pitäisi tarkistaa sen tyyppi? Joko älä anna tyyppiä, jota et voi käsitellä, tai älä yritä huijata mahdollisia koodin uudelleenkäyttäjiäsi, heillä voi olla hyvä syy olla antamatta funktiollesi intiä.

Kommentit (8)

Löysin asiaan liittyvän kysymyksen täältä SO:sta.

Python-kehittäjät haluavat olla tarkistamatta tyyppejä vaan tehdä tyyppikohtaisen operaation ja ottaa kiinni TypeError poikkeuksen. Mutta jos et tiedä tyyppiä, niin sitten sinulla on seuraava.

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

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