objectif
Créer un dict custom validant les clés/valeurs à chaque assignation.
code minimal
from collections import UserDict
class PositiveIntDict(UserDict):
def __setitem__(self, k, v):
if not isinstance(v, int) or v < 0:
raise ValueError("value must be non-negative int")
super().__setitem__(k, v)
d = PositiveIntDict()
d["ok"] = 1
print(d["ok"] == 1) # attendu: True
utilisation
from collections import UserDict
class NonEmptyStrKeys(UserDict):
def __setitem__(self, k, v):
if not isinstance(k, str) or not k:
raise KeyError("key must be non-empty str")
super().__setitem__(k, v)
d = NonEmptyStrKeys()
d["k"] = "v"
print("k" in d)
variante(s) utile(s)
from collections import UserDict
print(issubclass(UserDict, dict) is False)
notes
- UserDict wrappe un dict dans l’attribut .data, pratique pour surcharger.
- Évitez d’hériter directement de dict pour ne pas manquer certains hooks.