do-not-widen-types-to-silence-the-checker
Gdy sprawdzacz typów odrzuca wywołanie lub wartość zwracaną, zawęź wartość albo obsłuż brakujący przypadek, zamiast poszerzać adnotację do Any, object lub niesprawdzonej unii.
Nadane przez osobę, która przeczytała kartę, a nie deklarowane przez sam plik. Karta, którą agent destyluje podczas przebiegu z niezaufaną treścią, rodzi się skażona i czeka na recenzję, zanim kiedykolwiek zostanie pobrana.
Kiedy przychodzi na myśl
- błąd sprawdzacza typów w argumencie lub zwracanej wartości
- pokusa, by dodać Any albo cast, żeby mypy lub pyright przeszły
- unia zawiera None, a wywołujący oczekuje konkretnego typu
- poszerzanie sygnatury tylko po to, by obsłużyć jedno miejsce wywołania
Wartość zwykle kryje się w Unikaj i Sprawdź. Rób to sekcja, którą pisze każdy.
Treść karty powyżej to tłumaczenie. Angielski oryginał jest tym, co importuje CLI, co agent czyta w czasie działania i czego dotyczy hasz poniżej.
Wyzwalacz
Statyczny sprawdzacz typów (mypy, pyright, tsc, cargo check) zgłasza niezgodny typ, na przykład przekazanie str | None tam, gdzie wymagany jest str, albo zwrócenie unii szerszej niż zadeklarowana sygnatura. Najszybszym sposobem, by komunikat zniknął, jest poszerzenie adnotacji parametru lub zwracanej wartości (Any, object, unknown, # type: ignore, albo dopisanie | None do interfejsu, który nigdy nie miał tego przyjmować).
Rób
- Zrozum, co sprawdzacz faktycznie dowodzi: która gałąź może zwrócić nieoczekiwany typ i czy ta gałąź jest osiągalna w czasie wykonania. 2. Jeśli szersza wartość jest błędem lub nieobsłużonym przypadkiem brzegowym w miejscu wywołania, zawęź ją przed wywołaniem: sprawdź
None, zwaliduj dane wejściowe na granicy albo wcześnie zgłoś czytelny błąd. 3. Jeśli funkcja naprawdę obsługuje szerszy typ, zaktualizuj jej implementację tak, by obsługiwała każdy element tego typu, zanim poszerzysz sygnaturę. 4. Utrzymuj wąską granicę: parsuj lub doprecyzowuj dane bez typów (dict[str, Any], surowy JSON) raz, przy wejściu do modułu, zamiast przenosić szerokie typy do środka.
Unikaj
Traktowanie sprawdzacza typów jako przeszkody do załagodzenia zamiast dowodu, że gałąź nie jest obsłużona. Klasyczny błąd to zmiana def load_user(user_id: str) -> User tak, by przyjmowała str | None albo zwracała User | Any, bo jeden wywołujący zapomniał sprawdzić, czy user_id jest podane. Sprawdzacz od razu zieleni się, nieobsłużone None przechodzi z błędu statycznego na granicy w AttributeError w czasie wykonania, trzy ramki dalej, a każdy dalszy wywołujący dziedziczy szerszą unię albo traci sprawdzanie w ogóle. Równie złe jest postawienie cast(...) lub # type: ignore na linii bez niezmiennika w bezpośrednio poprzedzającym kodzie, który czyni cast prawdziwym.
Sprawdź
Uruchom sprawdzacz typów na dotkniętym module i przejrzyj diff każdej zmienionej sygnatury. Każdy nowo poszerzony parametr lub zwracany typ ma jawną gałąź albo test obejmujący dodany przypadek. Nie wprowadzono Any, cast ani # type: ignore wyłącznie po to, by uciszyć niezgodność, którą dało się rozwiązać przez zawężenie na granicy. Wywołujący dalej nie musieli dodawać defensywnych sprawdzeń dla typu, którego producent nigdy nie musiał emitować.
Ryzyko
Czasem stub biblioteki jest rzeczywiście błędny lub niepełny, a zewnętrzny ładunek bywa naprawdę dowolny, dopóki późniejszy etap go nie sprawdzi. W takich przypadkach lepsze jest lokalne, udokumentowane # type: ignore[code] albo wąski adapter na granicy niż zniekształcanie kodu wykonawczego martwymi gałęziami tylko po to, by zadowolić zepsuty stub.
Jak użyć
Karta to dane. Sklonuj repozytorium i zaimportuj ją ścieżką — to, co przychodzi przez sieć, jest traktowane jako skażone i wstrzymywane do zatwierdzenia. Taki jest pożądany sposób działania i dlatego nie ma tu instalatora w jednej linijce.
git clone https://github.com/brcampidelli/chimera-agent.gitchimera skills-import chimera-agent/skills/do-not-widen-types-to-silence-the-checker/SKILL.mdIntegralność
SHA-256 pliku w postaci opublikowanej. Importujący może sprawdzić, że otrzymał dokładnie to, co pokazała ta strona.
9fdad16332fb728bb73f495c19effaeab028d4160a220ad94a8ff0ab8996a5b9