ProgrammationDéveloppeur Python

Quelles sont les particularités de l'utilisation du type frozenset en Python, comment l'utiliser et quand est-il indispensable ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

Historique de la question

Le type frozenset est apparu en Python comme la version immuable du type set standard. Il était important de permettre l'utilisation d'ensembles comme éléments d'autres sets et comme clés dans un dict — c'est pourquoi une version immuable s'est avérée nécessaire.

Problème

Le besoin pratique est d'avoir l'unicité et la capacité de vérifier rapidement l'appartenance, ainsi que d'utiliser un ensemble comme clé d'un dictionnaire ou élément d'un autre ensemble. Un set ordinaire ne convient pas, car il est mutable et donc non hachable.

Solution

frozenset — ensemble immuable. Après sa création, ses éléments ne peuvent pas être modifiés : ajoutés, supprimés ou changés. Mais frozenset prend en charge toutes les mêmes opérations que set, sauf celles qui modifient.

Exemple de code:

fs = frozenset([1, 2, 3]) print(2 in fs) # True # fs.add(4) # AttributeError: l'objet 'frozenset' n'a pas d'attribut 'add' map_dict = {fs: 'frozen'} # Acceptable, car frozenset est hachable

Caractéristiques clés :

  • frozenset — ensemble immuable et hachable.
  • Prend en charge toutes les méthodes non destructrices des ensembles ordinaires (union, intersection, différence).
  • Peut être utilisé comme clé dans un dictionnaire ou élément d'un autre set.

Questions pièges.

Un frozenset peut-il contenir des objets mutables (par exemple, une liste) ?

Non, seuls les objets hachables/immuables peuvent être des éléments d'un ensemble de n'importe quel type. frozenset([[], 1]) entraînera un TypeError, tout comme set ordinaire.

Peut-on obtenir un set mutable à partir d'un frozenset et vice versa ?

Les deux types peuvent être convertis l'un en l'autre via les constructeurs standard :

fs = frozenset([1,2,3]) s = set(fs) print(type(s)) # <class 'set'>

frozenset prend-il en charge les méthodes add() ou remove() ?

Non, ces méthodes sont absentes, toute tentative de les invoquer entraînera un AttributeError, car frozenset est immuable.

Erreurs typiques et antipatterns

  • Essayer d'ajouter ou de supprimer un élément d'un frozenset.
  • Utiliser des types mutables comme éléments d'un frozenset.
  • S'attendre à ce que frozenset puisse être modifié après sa création.

Exemple de la vie

Cas négatif

Utiliser un set ordinaire comme clé dans un dict :

s = set([1, 2]) d = {s: 'value'} # TypeError: type 'set' non hachable

Avantages :

  • Tentative simple, type familier — moins de code.

Inconvénients :

  • Erreur à l'exécution.
  • Impossible de réaliser le comportement souhaité.

Cas positif

Transformation en frozenset :

fs = frozenset([1, 2]) d = {fs: 'value'} # OK print(d[frozenset([1, 2])]) # 'value'

Avantages :

  • Comportement attendu, pas d'erreur.
  • Peut servir de clé, ensemble de clés, etc.

Inconvénients :

  • frozenset ne peut pas être modifié après sa création, si des éléments doivent être mis à jour — il faut créer un nouvel objet.