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