type(), isinstance(), каб атрымаць і вызначыць тып у Python

Бізнэс

У Python убудаваныя функцыі type() і isinstance() выкарыстоўваюцца для атрымання і праверкі тыпу аб’екта, напрыклад зменнай, і для вызначэння таго, ці належыць ён да пэўнага тыпу.

Тут тлумачыцца наступнае змест разам з прыкладам кода.

  • Атрымаць і праверыць тып аб’екта:type()
  • Вызначэнне тыпу аб’екта:type(),isinstance()
    • Вызначэнне тыпу з дапамогай type()
    • Вызначэнне тыпу з дапамогай isinstance()
    • Розніца паміж type() і isinstance()

Замест таго, каб вызначаць тып аб’екта, можна выкарыстоўваць апрацоўку выключэнняў або ўбудаваную функцыю hasattr(), каб вызначыць, ці мае аб’ект правільныя метады і атрыбуты.

Атрымаць і праверыць тып аб’екта:тып()

type(object) – гэта функцыя, якая вяртае тып аб’екта, перададзенага ў якасці аргумента. Гэта можа быць выкарыстана, каб даведацца тып аб’екта.

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

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

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

Вяртанае значэнне type() з’яўляецца аб’ектам тыпу, такім як str або int.

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

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

Вызначэнне тыпу аб’екта:type(),isinstance()

Выкарыстоўвайце type() або isinstance(), каб вызначыць тып.

Вызначэнне тыпу з дапамогай type()

Параўноўваючы вяртанае значэнне type() з адвольным тыпам, можна вызначыць, ці з’яўляецца аб’ект любога тыпу.

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

Калі вы хочаце вызначыць, ці з’яўляецца гэта адным з некалькіх тыпаў, выкарыстоўвайце аператар in і картэж або спіс некалькіх тыпаў.

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

Таксама можна вызначыць функцыі, якія змяняюць апрацоўку ў залежнасці ад тыпу аргумента.

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

Вызначэнне тыпу з дапамогай isinstance()

isinstance(аб’ект, клас) – гэта функцыя, якая вяртае праўду, калі аб’ект першага аргументу з’яўляецца асобнікам тыпу або падкласа другога аргумента.

Другі аргумент можа быць наборам тыпаў. Калі гэта асобнік любога тыпу, вяртаецца true.

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

print(isinstance(100, str))
# False

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

Функцыю, падобную да прыкладу вызначэння тыпу з дапамогай type(), можна запісаць наступным чынам

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

Розніца паміж type() і isinstance()

Розніца паміж type() і isinstance() заключаецца ў тым, што isinstance() вяртае праўду для асобнікаў падкласаў, якія наследуюць клас, паказаны ў якасці другога аргумента.

Напрыклад, вызначаны наступныя суперклас (базавы клас) і падклас (вытворны клас).

class Base:
    pass

class Derive(Base):
    pass

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

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

Вызначэнне тыпу з дапамогай type() вяртае праўду, толькі калі тыпы супадаюць, але isinstance() вяртае праўду нават для суперкласаў.

print(type(derive) is Derive)
# True

print(type(derive) is Base)
# False

print(isinstance(derive, Derive))
# True

print(isinstance(derive, Base))
# True

Нават для стандартных тыпаў, напрыклад, булеўскага тыпу bool (true,false), трэба быць асцярожным. bool з’яўляецца падкласам цэлага тыпу, таму isinstance() вяртае праўду нават для int, ад якога ён успадкоўваецца.

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

Калі вы хочаце вызначыць дакладны тып, выкарыстоўвайце type(); калі вы хочаце вызначыць тып з улікам спадчыннасці, выкарыстоўвайце isinstance().

Убудаваная функцыя issubclass() таксама забяспечваецца, каб вызначыць, ці з’яўляецца клас падкласам іншага класа.

print(issubclass(bool, int))
# True

print(issubclass(bool, float))
# False