Comment vérifier le type de données en Python (type vs isinstance)

Découvrez comment vérifier les types de données en Python. Comprenez quand utiliser type() vs isinstance(), gérez les classes personnalisées et écrivez des validations de vérification de type sécurisées.

Essayez cette solution dans l'éditeur

Aperçu

Python est un langage typé dynamiquement, ce qui signifie que les variables peuvent contenir des valeurs de n'importe quel type de données et que leur type peut changer pendant l'exécution. Bien que cette flexibilité accélère le développement initial, elle vous oblige également à vérifier les types de variables au moment de l'exécution avant d'exécuter des opérations spécifiques au type, telles que l'exécution d'opérations arithmétiques sur des entiers ou l'appel de méthodes de chaîne.

Pour vérifier le type de données d'un objet, Python fournit deux fonctions principales : `type()` et `isinstance()`. La fonction `type(obj)` renvoie le type de classe précis de l'objet. Bien que vous puissiez utiliser `type(obj) == int` pour vérifier si un nombre est un entier, cette méthode est généralement déconseillée car elle ne prend pas en charge les structures d'héritage (une sous-classe d'un entier serait évaluée à `False`).

La manière pythonique recommandée pour vérifier les types est `isinstance(obj, class_info)`. Cette fonction vérifie si un objet est une instance de la classe spécifiée ou de toute sous-classe héritée de celle-ci. Il prend également en charge la vérification par rapport à un tuple de classes (par exemple, `isinstance(value, (int, float))`), ce qui rend le code de validation très flexible et robuste.

Sortie de code et d'exécution

Ce script montre la vérification des types de variables à l'aide de type() et isinstance(), montrant les différences d'héritage.

value_int = 42
value_str = "hello"

# 1. Checking type using isinstance() (Recommended)
is_number = isinstance(value_int, int)
print(f"Is {value_int} an int? {is_number}")

# Checking against multiple possible types
is_num_or_str = isinstance(value_str, (int, float, str))
print(f"Is '{value_str}' int, float, or str? {is_num_or_str}")

# 2. Checking type using type() (For exact class matches)
print(f"Exact type of value_int: {type(value_int).__name__}")
print("Is value_int exactly an int?", type(value_int) is int)

# 3. Inheritance difference
class CustomList(list):
    pass

my_list = CustomList([1, 2, 3])

print("\nInheritance testing:")
print("isinstance(my_list, list):", isinstance(my_list, list))
print("type(my_list) is list:", type(my_list) is list)
Sortie terminale
Is 42 an int? True
Is 'hello' int, float, or str? True
Exact type of value_int: int
Is value_int exactly an int? True

Inheritance testing:
isinstance(my_list, list): True
type(my_list) is list: False

Mise en œuvre étape par étape

  • Utilisez isinstance(variable, type_name) pour la vérification générale du type (conforme à l'héritage).
  • Transmettez un tuple de types comme isinstance(variable, (int, float)) pour vérifier plusieurs classes.
  • Utilisez type(variable) is type_name uniquement lorsque vous devez garantir la correspondance exacte de la classe, en ignorant les sous-classes.

Foire aux questions

Pourquoi isinstance() est-il préféré à type() ?

isinstance() prend en charge l'héritage d'objets et le polymorphisme. Si vous sous-classez un type intégré, isinstance() le reconnaîtra correctement comme une instance de la classe parent, tandis que type() sera évalué à False.

Comment puis-je vérifier si un objet est appelable (comme une fonction) ?

Utilisez la fonction callable() intégrée, qui renvoie True si l'objet peut être invoqué comme une fonction.

Sujets connexes

Ressources Python recommandées

Développez vos connaissances avec des didacticiels interactifs, des aide-mémoire et des comparaisons de codes associés.