Je parle d’un cas d’utilisation basique sans analyse statique : deux namedtuples de types différents partagent globalement la même interface (l’interface des tuples) et sont donc compatibles entre-eux.
Cela ne lève pas d’erreur à l’exécution si seulement les opérations des tuples sont utilisés sur ces objets.
Il faut aussi que les dimensions des tuples ainsi que les interfaces des divers éléments utilisés soient compatibles pour que ça passe.
Retirer cette interface commune (en utilisant une dataclass par exemple) empêche d’utiliser un type comme un autre si les noms de leurs champs diffèrent.
Mouais, tu remplaces l’interface commune aux NamedTuple
par l’interface commune aux dataclass (qui est celle de n’importe quel objet). Dans un cas comme dans l’autre, tu n’échappes pas à la limitation du duck typing qui ne voit que la surface effectivement utilisée de l’interface des instances manipulées (même pas de leurs classes). Alors, certes, l’interface commune entre deux NamedTuple
quelconques est un peu plus large qu’entre deux dataclass
quelconques, mais ça me parait extrêmement trompeur de déclarer qu’utiliser des dataclass
évite par exemple de prendre les données pour ce qu’elles ne sont pas
de manière significativement plus robuste qu’utiliser des NamedTuple
. J’irai même plus loin, le duck typing étant incapable de gérer la sémantique des données manipulées, il est illusoire de se protéger de ça (prendre des données pour ce qu’elles ne sont pas) sans utiliser des outils statiques.