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.
- class type(object) — Built-in Functions — Python 3.10.4 Documentation
- isinstance(object, classinfo) — Built-in Functions — Python 3.10.4 Documentation
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