type(), isinstance() för att ta fram och bestämma typ i Python

Företag

I Python används de inbyggda funktionerna type() och isinstance() för att ta fram och kontrollera typen av ett objekt, t.ex. en variabel, och för att avgöra om den är av en viss typ.

Följande innehåll förklaras här, tillsammans med exempelkod.

  • Upptäcka och kontrollera objekttyp:type()
  • Fastställande av objekttyp:type(),isinstance()
    • Typbestämning med hjälp av type()
    • Typbestämning med hjälp av isinstance()
    • Skillnaden mellan type() och isinstance()

Istället för att bestämma ett objekts typ kan man använda undantagshantering eller den inbyggda funktionen hasattr() för att avgöra om ett objekt har rätt metoder och attribut.

Upptäcka och kontrollera objekttyp: typ()

type(object) är en funktion som returnerar typen av det objekt som överlämnats som argument. Detta kan användas för att ta reda på typen av ett objekt.

print(type('string'))
# <class 'str'>

print(type(100))
# <class 'int'>

print(type([0, 1, 2]))
# <class 'list'>

Returvärdet av type() är ett typobjekt, t.ex. str eller int.

print(type(type('string')))
# <class 'type'>

print(type(str))
# <class 'type'>

Fastställande av objekttyp: type(), isinstance()

Använd type() eller isinstance() för att bestämma typen.

Typbestämning med hjälp av type()

Genom att jämföra returvärdet av type() med en godtycklig typ kan man avgöra om objektet är av vilken typ som helst.

print(type('string') is str)
# True

print(type('string') is int)
# False
def is_str(v):
    return type(v) is str

print(is_str('string'))
# True

print(is_str(100))
# False

print(is_str([0, 1, 2]))
# False

Om du vill avgöra om det är en av flera typer använder du in-operatören och en tupel eller lista med flera typer.

def is_str_or_int(v):
    return type(v) in (str, int)

print(is_str_or_int('string'))
# True

print(is_str_or_int(100))
# True

print(is_str_or_int([0, 1, 2]))
# False

Det är också möjligt att definiera funktioner som ändrar behandling beroende på argumenttyp.

def type_condition(v):
    if type(v) is str:
        print('type is str')
    elif type(v) is int:
        print('type is int')
    else:
        print('type is not str or int')

type_condition('string')
# type is str

type_condition(100)
# type is int

type_condition([0, 1, 2])
# type is not str or int

Typbestämning med hjälp av isinstance()

isinstance(object, class) är en funktion som returnerar sant om objektet i det första argumentet är en instans av typen eller underklassen i det andra argumentet.

Det andra argumentet kan vara en tupel av typer. Om det är en instans av någon av typerna returneras true.

print(isinstance('string', str))
# True

print(isinstance(100, str))
# False

print(isinstance(100, (int, str)))
# True

En funktion som liknar exemplet med typbestämning med hjälp av type() kan skrivas på följande sätt

def is_str(v):
    return isinstance(v, str)

print(is_str('string'))
# True

print(is_str(100))
# False

print(is_str([0, 1, 2]))
# False
def is_str_or_int(v):
    return isinstance(v, (int, str))

print(is_str_or_int('string'))
# True

print(is_str_or_int(100))
# True

print(is_str_or_int([0, 1, 2]))
# False
def type_condition(v):
    if isinstance(v, str):
        print('type is str')
    elif isinstance(v, int):
        print('type is int')
    else:
        print('type is not str or int')

type_condition('string')
# type is str

type_condition(100)
# type is int

type_condition([0, 1, 2])
# type is not str or int

Skillnaden mellan type() och isinstance()

Skillnaden mellan type() och isinstance() är att isinstance() returnerar sant för instanser av underklasser som ärver den klass som anges som det andra argumentet.

Till exempel definieras följande superklass (basklass) och subklass (härledd klass)

class Base:
    pass

class Derive(Base):
    pass

base = Base()
print(type(base))
# <class '__main__.Base'>

derive = Derive()
print(type(derive))
# <class '__main__.Derive'>

Typbestämning med hjälp av type() returnerar sant endast när typerna stämmer överens, men isinstance() returnerar sant även för överklasser.

print(type(derive) is Derive)
# True

print(type(derive) is Base)
# False

print(isinstance(derive, Derive))
# True

print(isinstance(derive, Base))
# True

Även när det gäller standardtyper, t.ex. den boolska typen bool (true,false), måste man vara försiktig. bool är en underklass till heltalstypen, så isinstance() returnerar sant även för en int som den ärvs från.

print(type(True))
# <class 'bool'>

print(type(True) is bool)
# True

print(type(True) is int)
# False

print(isinstance(True, bool))
# True

print(isinstance(True, int))
# True

Om du vill bestämma den exakta typen använder du type(); om du vill bestämma typen med hänsyn till arv använder du isinstance().

Den inbyggda funktionen issubclass() finns också för att avgöra om en klass är en underklass till en annan klass.

print(issubclass(bool, int))
# True

print(issubclass(bool, float))
# False