do-not-widen-types-to-silence-the-checker
Quando un controllore di tipi rifiuta una chiamata o un valore di ritorno, restringi il valore o gestisci il caso mancante invece di allargare l'annotazione a Any, object o a un'unione non verificata.
Conferita da chi ha letto la scheda, non rivendicata dal file su se stesso. Una scheda che l'agente distilla durante un'esecuzione che ha consumato contenuti non affidabili nasce contaminata e resta in attesa di revisione prima di essere mai recuperata.
Quando viene in mente
- errore del controllore di tipi su un argomento o un valore di ritorno
- la tentazione di aggiungere Any o cast per far passare mypy o pyright
- l'unione include None e il chiamante si aspetta un tipo concreto
- allargare una firma solo per soddisfare un singolo punto di chiamata
Il valore di solito sta in Evita e Verifica. Fai è la sezione che scrivono tutti.
Il corpo della scheda qui sopra è una traduzione. L'originale inglese è ciò che la CLI importa, ciò che l'agente legge in esecuzione e ciò che l'hash qui sotto attesta.
Trigger
Un controllore di tipi statico (mypy, pyright, tsc, cargo check) segnala un tipo incompatibile, ad esempio passare str | None dove serve str, o restituire un'unione più ampia della firma dichiarata. Il modo più rapido per far sparire la diagnosi è allargare l'annotazione del parametro o del ritorno (Any, object, unknown, # type: ignore, o aggiungere | None a un'interfaccia che non avrebbe mai dovuto accettarlo).
Fai
- Capisci cosa sta dimostrando davvero il controllore: quale ramo può produrre il tipo inatteso e se quel ramo è raggiungibile a runtime. 2. Se il valore più ampio è un bug o un caso limite non gestito nel punto di chiamata, restringilo prima della chiamata: verifica
None, convalida l'input al confine o solleva subito un errore chiaro. 3. Se la funzione supporta davvero il tipo più ampio, aggiorna la sua implementazione per gestire ogni membro di quel tipo prima di allargare la firma. 4. Mantieni stretto il confine: interpreta o affina i dati non tipizzati (dict[str, Any], JSON grezzo) una sola volta, all'ingresso del modulo, invece di propagare tipi larghi verso l'interno.
Evita
Trattare il controllore di tipi come un ostacolo da accontentare invece che come la prova che un ramo non è gestito. L'errore classico è cambiare def load_user(user_id: str) -> User per accettare str | None o restituire User | Any perché un chiamante ha dimenticato di verificare che user_id fosse presente. Il controllore diventa verde subito, il None non gestito passa da errore statico al confine a un AttributeError a runtime tre frame più in là, e ogni chiamante a valle eredita l'unione più ampia o perde del tutto il controllo. Altrettanto sbagliato è applicare cast(...) o # type: ignore su una riga senza un invariante nel codice immediatamente precedente che renda vero il cast.
Verifica
Esegui il controllore di tipi sul modulo modificato e ispeziona il diff di ogni firma cambiata. Ogni parametro o ritorno appena allargato ha un ramo esplicito o un test che copre il caso aggiunto. Non sono stati introdotti Any, cast o # type: ignore solo per zittire una mancata corrispondenza che si poteva risolvere restringendo al confine. I chiamanti a valle non hanno dovuto aggiungere controlli difensivi per un tipo che il produttore non avrebbe mai dovuto emettere.
Rischio
A volte uno stub di libreria è davvero errato o incompleto, oppure un payload esterno è davvero arbitrario finché una fase successiva non lo ispeziona. In quei casi un # type: ignore[code] localizzato e documentato, o un adattatore di confine stretto, è meglio che piegare il codice di runtime con rami morti solo per soddisfare uno stub rotto.
Come usarla
La scheda è un dato. Clona il repository e importala per percorso — ciò che arriva dalla rete è trattato come contaminato e trattenuto in attesa di approvazione, che è il comportamento desiderabile e il motivo per cui qui non c'è un installatore in una riga.
git clone https://github.com/brcampidelli/chimera-agent.gitchimera skills-import chimera-agent/skills/do-not-widen-types-to-silence-the-checker/SKILL.mdIntegrità
SHA-256 del file così com'è pubblicato. Chi lo importa può verificare che ciò che ha ricevuto sia ciò che questa pagina mostrava.
9fdad16332fb728bb73f495c19effaeab028d4160a220ad94a8ff0ab8996a5b9