Aller au contenu

← Skills

do-not-widen-types-to-silence-the-checker

Quand un vérificateur de types rejette un appel ou une valeur de retour, resserrez la valeur ou traitez le cas manquant plutôt que d'élargir l'annotation à Any, object ou à une union non vérifiée.

PatronProvenance: cleanStatut: activev0.1.0 · Apache-2.0

Conférée par la personne qui a relu la fiche, et non revendiquée par le fichier lui-même. Une fiche que l'agent distille au cours d'une exécution ayant consommé du contenu non fiable naît contaminée et reste en attente de relecture avant d'être un jour récupérée.

Quand elle vient à l'esprit

  • erreur du vérificateur de types sur un argument ou une valeur de retour
  • la tentation d'ajouter Any ou cast pour faire passer mypy ou pyright
  • l'union inclut None alors que l'appelant attend un type concret
  • élargir une signature juste pour satisfaire un seul site d'appel

C'est dans À éviter et Vérifier que se trouve d'ordinaire la valeur. À faire est la section que tout le monde écrit.

Le corps de la fiche ci-dessus est une traduction. L'original anglais est ce que la CLI importe, ce que l'agent lit à l'exécution et ce que l'empreinte ci-dessous atteste.

Déclencheur

Un vérificateur de types statique (mypy, pyright, tsc, cargo check) signale un type incompatible, par exemple passer str | None là où str est requis, ou renvoyer une union plus large que la signature déclarée. Le moyen le plus rapide de faire disparaître le diagnostic est d'élargir l'annotation du paramètre ou du retour (Any, object, unknown, # type: ignore, ou ajouter | None à une interface qui ne devait jamais l'accepter).

À faire

  1. Comprenez ce que le vérificateur prouve réellement : quelle branche peut produire le type inattendu, et si cette branche est atteignable à l'exécution. 2. Si la valeur plus large est un bogue ou un cas limite non traité au site d'appel, resserrez-la avant l'appel : testez None, validez l'entrée à la frontière ou levez tôt une erreur claire. 3. Si la fonction accepte réellement le type plus large, mettez à jour son implémentation pour traiter chaque membre de ce type avant d'élargir la signature. 4. Gardez la frontière étroite : analysez ou affinez les données non typées (dict[str, Any], JSON brut) une seule fois, à l'entrée du module, au lieu de propager des types larges vers l'intérieur.

À éviter

Traiter le vérificateur de types comme un obstacle à apaiser plutôt que comme la preuve qu'une branche n'est pas traitée. L'échec classique consiste à changer def load_user(user_id: str) -> User pour accepter str | None ou renvoyer User | Any parce qu'un appelant a oublié de vérifier la présence de user_id. Le vérificateur passe au vert immédiatement, le None non traité passe d'une erreur statique à la frontière à une AttributeError à l'exécution, trois niveaux plus loin, et chaque appelant en aval hérite de l'union élargie ou perd complètement la vérification. Tout aussi mauvais : coller un cast(...) ou un # type: ignore sur une ligne sans invariant dans le code qui précède immédiatement, qui rende le cast vrai.

Vérifier

Lancez le vérificateur de types sur le module modifié et inspectez le diff de chaque signature changée. Tout paramètre ou retour nouvellement élargi a une branche explicite ou un test qui couvre le cas ajouté. Aucun Any, cast ou # type: ignore n'a été introduit uniquement pour faire taire une incompatibilité qui pouvait être résolue en resserrant à la frontière. Les appelants en aval n'ont pas eu à ajouter de vérifications défensives pour un type que le producteur n'avait jamais besoin d'émettre.

Risque

Parfois un stub de bibliothèque est réellement faux ou incomplet, ou une charge utile externe est vraiment arbitraire jusqu'à ce qu'une étape ultérieure l'inspecte. Dans ces cas, un # type: ignore[code] localisé et documenté, ou un adaptateur de frontière étroit, vaut mieux que de déformer le code d'exécution avec des branches mortes pour satisfaire un stub défectueux.

L'utiliser

La fiche est une donnée. Clonez le dépôt et importez-la par son chemin — ce qui arrive par le réseau est traité comme contaminé et retenu pour approbation, ce qui est le comportement souhaitable et la raison pour laquelle il n'y a pas d'installateur en une ligne ici.

git clone https://github.com/brcampidelli/chimera-agent.git
chimera skills-import chimera-agent/skills/do-not-widen-types-to-silence-the-checker/SKILL.md

Intégrité

SHA-256 du fichier tel qu'il est publié. Qui l'importe peut vérifier que ce qu'il a reçu correspond à ce que cette page affichait.

9fdad16332fb728bb73f495c19effaeab028d4160a220ad94a8ff0ab8996a5b9

Lire la fiche dans le dépôt →