Zum Inhalt springen

← Skills

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

Wenn ein Typprüfer einen Aufruf oder einen Rückgabewert ablehnt, engen Sie den Wert ein oder behandeln Sie den fehlenden Fall, statt die Annotation auf Any, object oder eine ungeprüfte Union zu erweitern.

MusterHerkunft: cleanStatus: activev0.1.0 · Apache-2.0

Verliehen von der Person, die die Karte gelesen hat — nicht von der Datei über sich selbst behauptet. Eine Karte, die der Agent während eines Laufs mit nicht vertrauenswürdigen Inhalten destilliert, kommt kontaminiert zur Welt und wird bis zur Prüfung zurückgehalten, bevor sie jemals abgerufen wird.

Wann sie in den Sinn kommt

  • Typprüferfehler bei einem Argument oder Rückgabewert
  • die Versuchung, Any oder cast hinzuzufügen, damit mypy oder pyright durchlaufen
  • die Union enthält None, und der Aufrufer erwartet einen konkreten Typ
  • eine Signatur nur erweitern, um eine einzelne Aufrufstelle zu bedienen

In Vermeiden und Prüfen steckt meist der Wert. Tun ist der Abschnitt, den alle schreiben.

Der Kartentext oben ist eine Übersetzung. Das englische Original ist das, was die CLI importiert, was der Agent zur Laufzeit liest und was der Hash unten bezeugt.

Auslöser

Ein statischer Typprüfer (mypy, pyright, tsc, cargo check) meldet einen inkompatiblen Typ, etwa wenn str | None übergeben wird, wo str verlangt ist, oder ein Rückgabewert breiter ist als die deklarierte Signatur. Der schnellste Weg, die Meldung verschwinden zu lassen, ist, die Annotation des Parameters oder Rückgabewerts zu erweitern (Any, object, unknown, # type: ignore, oder | None zu einer Schnittstelle hinzufügen, die das nie akzeptieren sollte).

Tun

  1. Verstehen Sie, was der Prüfer tatsächlich belegt: Welcher Zweig kann den unerwarteten Typ erzeugen, und ist dieser Zweig zur Laufzeit erreichbar? 2. Wenn der breitere Wert ein Fehler oder ein unbehandelter Randfall an der Aufrufstelle ist, engen Sie ihn vor dem Aufruf ein: prüfen Sie auf None, validieren Sie die Eingabe an der Grenze oder lösen Sie früh einen klaren Fehler aus. 3. Wenn die Funktion den breiteren Typ tatsächlich unterstützt, passen Sie ihre Implementierung an, sodass jeder Bestandteil dieses Typs behandelt wird, bevor Sie die Signatur erweitern. 4. Halten Sie die Grenze eng: Parsen oder verfeinern Sie ungetypte Daten (dict[str, Any], rohes JSON) einmal beim Eintritt in das Modul, statt breite Typen nach innen weiterzureichen.

Vermeiden

Den Typprüfer als Hindernis zu behandeln, das man beschwichtigt, statt als Beweis dafür, dass ein Zweig unbehandelt ist. Der klassische Fehler ist, def load_user(user_id: str) -> User so zu ändern, dass es str | None akzeptiert oder User | Any zurückgibt, weil ein Aufrufer vergessen hat zu prüfen, ob user_id vorhanden ist. Der Prüfer wird sofort grün, das unbehandelte None wandert von einem statischen Fehler an der Grenze zu einer AttributeError zur Laufzeit drei Ebenen tiefer, und jeder nachgelagerte Aufrufer übernimmt die breitere Union oder verliert die Prüfung ganz. Genauso schlecht ist es, cast(...) oder # type: ignore auf eine Zeile zu setzen, ohne dass der unmittelbar davorstehende Code eine Invariante liefert, die den Cast wahr macht.

Prüfen

Führen Sie den Typprüfer auf dem geänderten Modul aus und prüfen Sie den Diff jeder geänderten Signatur. Jeder neu erweiterte Parameter- oder Rückgabetyp hat einen expliziten Zweig oder einen Test, der den hinzugefügten Fall abdeckt. Kein Any, cast oder # type: ignore wurde allein eingeführt, um eine Abweichung zu unterdrücken, die sich durch Eingrenzen an der Grenze hätte lösen lassen. Nachgelagerte Aufrufer mussten keine defensiven Prüfungen für einen Typ ergänzen, den der Erzeuger nie ausgeben musste.

Risiko

Manchmal ist ein Bibliotheks-Stub tatsächlich falsch oder unvollständig, oder eine externe Nutzlast ist wirklich beliebig, bis eine spätere Stufe sie untersucht. In solchen Fällen ist ein lokales, dokumentiertes # type: ignore[code] oder ein enger Grenzadapter besser, als den Laufzeitcode mit toten Zweigen zu verbiegen, nur um einen fehlerhaften Stub zufriedenzustellen.

Verwenden

Die Karte ist Daten. Klonen Sie das Repository und importieren Sie sie über den Pfad — was über das Netz kommt, gilt als kontaminiert und wird bis zur Freigabe zurückgehalten. Das ist das gewünschte Verhalten und der Grund, warum es hier keinen Einzeiler-Installer gibt.

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

Integrität

SHA-256 der Datei in der veröffentlichten Fassung. Wer sie importiert, kann prüfen, dass das Empfangene dem entspricht, was diese Seite gezeigt hat.

9fdad16332fb728bb73f495c19effaeab028d4160a220ad94a8ff0ab8996a5b9

Die Karte im Repository lesen →