type(), isinstance() pro získání a určení typu v jazyce Python

Podnikání

V jazyce Python slouží vestavěné funkce type() a isinstance() k získání a kontrole typu objektu, například proměnné, a k určení, zda je určitého typu.

Zde je vysvětlen následující obsah a ukázkový kód.

  • Zjištění a kontrola typu objektu:type()
  • Určení typu objektu:type(),isinstance()
    • Určení typu pomocí type()
    • Určení typu pomocí funkce isinstance()
    • Rozdíl mezi type() a isinstance()

Místo zjišťování typu objektu lze použít zpracování výjimek nebo vestavěnou funkci hasattr() ke zjištění, zda má objekt správné metody a atributy.

Zjištění a kontrola typu objektu: type()

type(object) je funkce, která vrací typ objektu předaného jako argument. Lze ji použít ke zjištění typu objektu.

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

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

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

Návratovou hodnotou funkce type() je objekt typu, například str nebo int.

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

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

Určení typu objektu: type(), isinstance()

K určení typu použijte type() nebo isinstance().

Určení typu pomocí type()

Porovnáním návratové hodnoty funkce type() s libovolným typem lze zjistit, zda je objekt libovolného typu.

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

Pokud chcete zjistit, zda se jedná o jeden z několika typů, použijte operátor in a tuple nebo seznam několika typů.

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

Je také možné definovat funkce, které mění zpracování v závislosti na typu argumentu.

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

Určení typu pomocí funkce isinstance()

isinstance(object, class) je funkce, která vrací true, pokud je objekt prvního argumentu instancí typu nebo podtřídy druhého argumentu.

Druhým argumentem může být trojice typů. Pokud je to instance některého z typů, je vrácena hodnota true.

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

print(isinstance(100, str))
# False

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

Funkci podobnou příkladu určení typu pomocí type() lze zapsat takto

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

Rozdíl mezi type() a isinstance()

Rozdíl mezi type() a isinstance() je v tom, že isinstance() vrací true pro instance podtříd, které dědí třídu uvedenou jako druhý argument.

Například jsou definovány následující nadtřída (základní třída) a podtřída (odvozená třída)

class Base:
    pass

class Derive(Base):
    pass

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

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

Určení typu pomocí type() vrací true pouze tehdy, když se typy shodují, ale funkce isinstance() vrací true i pro nadtřídy.

print(type(derive) is Derive)
# True

print(type(derive) is Base)
# False

print(isinstance(derive, Derive))
# True

print(isinstance(derive, Base))
# True

I u standardních typů, například u logického typu bool (true,false), je třeba dávat pozor. bool je podtřída typu integer, takže funkce isinstance() vrací true i pro int, od kterého je zděděna.

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

Pokud chcete určit přesný typ, použijte type(); pokud chcete určit typ se zohledněním dědičnosti, použijte isinstance().

K určení, zda je třída podtřídou jiné třídy, slouží také vestavěná funkce issubclass().

print(issubclass(bool, int))
# True

print(issubclass(bool, float))
# False