type(), isinstance() pour obtenir et déterminer le type en Python

Affaires

En Python, les fonctions intégrées type() et isinstance() sont utilisées pour obtenir et vérifier le type d'un objet, tel qu'une variable, et pour déterminer s'il est d'un type particulier.

Les contenus suivants sont expliqués ici, accompagnés d'un exemple de code.

  • Obtenir et vérifier le type d'objet:type()
  • Détermination du type d'objet:type(),isinstance()
    • Détermination du type à l'aide de type()
    • Détermination du type à l'aide de isinstance()
    • Différence entre type() et isinstance()

Au lieu de déterminer le type d'un objet, on peut utiliser le traitement des exceptions ou la fonction intégrée hasattr() pour déterminer si un objet possède les méthodes et les attributs corrects.

Obtenir et vérifier le type d'objet: type()

type(object) est une fonction qui renvoie le type de l'objet passé en argument. Elle peut être utilisée pour connaître le type d'un objet.

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

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

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

La valeur de retour de type() est un objet de type tel que str ou int.

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

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

Détermination du type d'objet: type(), isinstance()

Utilisez type() ou isinstance() pour déterminer le type.

Détermination du type à l'aide de type()

En comparant la valeur de retour de type() avec un type arbitraire, on peut déterminer si l'objet est d'un type quelconque.

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

Si vous voulez déterminer s'il s'agit d'un type parmi plusieurs, utilisez l'opérateur in et un tuple ou une liste de plusieurs types.

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

Il est également possible de définir des fonctions qui changent de traitement en fonction du type d'argument.

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

Détermination du type à l'aide de isinstance()

isinstance(object, class) est une fonction qui renvoie vrai si l'objet du premier argument est une instance du type ou de la sous-classe du second argument.

Le second argument peut être un tuple de types. S'il s'agit d'une instance de l'un ou l'autre type, true est retourné.

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

print(isinstance(100, str))
# False

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

Une fonction similaire à l'exemple de la détermination du type à l'aide de type() peut être écrite comme suit

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

Différence entre type() et isinstance()

La différence entre type() et isinstance() est que isinstance() renvoie vrai pour les instances des sous-classes qui héritent de la classe spécifiée comme second argument.

Par exemple, la superclasse (classe de base) et la sous-classe (classe dérivée) suivantes sont définies

class Base:
    pass

class Derive(Base):
    pass

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

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

La détermination du type à l'aide de type() renvoie un résultat vrai uniquement lorsque les types correspondent, mais isinstance() renvoie un résultat vrai même pour les superclasses.

print(type(derive) is Derive)
# True

print(type(derive) is Base)
# False

print(isinstance(derive, Derive))
# True

print(isinstance(derive, Base))
# True

Même pour les types standard, par exemple, le type booléen bool (true,false), il faut faire attention. bool est une sous-classe du type integer, donc isinstance() renvoie true même pour un int dont il est hérité.

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

Si vous voulez déterminer le type exact, utilisez type() ; si vous voulez déterminer le type en tenant compte de l'héritage, utilisez isinstance().

La fonction intégrée issubclass() est également fournie pour déterminer si une classe est une sous-classe d'une autre classe.

print(issubclass(bool, int))
# True

print(issubclass(bool, float))
# False
Copied title and URL