| name | ty-pro |
| description | Python型安全性をtyで強化。型アノテーション追加、型エラー修正、境界バリデーション実装時に使用。 |
ty-pro: Python Type Safety
tyを使ったPython型チェックと型安全なコード設計。
適用場面
- 型アノテーションの追加・改善
- ty型エラーの修正
- API境界でのバリデーション実装
- Any/cast/ignore の使用判断
🔄 型エラー修正ワークフロー
型エラー修正進捗:
- [ ] Step 1: ty check実行でエラー特定
- [ ] Step 2: エラー分類(真の問題 vs 抑制候補)
- [ ] Step 3: 修正実装
- [ ] Step 4: ty check再実行で確認
Step 1: エラー特定
uv run ty check src/
Step 2: エラー分類
- 真の型エラー → 修正
- 外部ライブラリ起因 →
# ty: ignore[rule]で抑制
- 境界入力 → バリデーション追加
Step 3-4: 修正→確認のループ
コマンド
uv run ty check src/
uv run ty check path/to/file.py
エラー抑制ポリシー
優先順位
- 修正(推奨): 型を正しく書く
- ナローイング:
isinstance、TypeGuardで絞り込み
- 抑制: 外部要因でやむを得ない場合のみ
抑制コメント形式
result = func()
value = data["key"]
result = untyped_lib.call()
関数単位の抑制
from typing import no_type_check
@no_type_check
def legacy_code():
pass
Any/cast使用ポリシー
Any
- 禁止: コア・ドメインモジュール
- 許可: 外部境界のみ(API入力、未型付きライブラリ)
- 必須: 即座にナローイングして精密型へ変換
def process(data: Any) -> Any: ...
def process(data: object) -> Result:
validated = parse_input(data)
return handle(validated)
cast
- 使用前に「なぜnarrowing不可か」を説明できること
- 理由コメント必須
count = cast(int, sdk.get_count())
境界バリデーションパターン
JSON入力
from typing import TypedDict
class UserInput(TypedDict):
name: str
age: int
def validate_user(data: object) -> UserInput:
if not isinstance(data, dict):
raise ValueError("Expected dict")
if "name" not in data or "age" not in data:
raise ValueError("Missing required fields")
return {"name": str(data["name"]), "age": int(data["age"])}
TypeGuard
from typing import TypeGuard
def is_string_list(val: object) -> TypeGuard[list[str]]:
return isinstance(val, list) and all(isinstance(x, str) for x in val)
モダン型機能(3.11+)
| 機能 | 用途 |
|---|
Protocol | 構造的型付け(インターフェース) |
TypedDict | JSON/dict契約 |
Literal | 判別ユニオン |
NewType | ドメインID(UserId等) |
Self | Fluent API |
TypeGuard | カスタムナローイング |
Anti-Patterns
- ❌
# ty: ignore を理由なく追加
- ❌ Anyをコアロジックに漏らす
- ❌ castを検証なしで使用
- ❌ 全ファイル抑制(
# type: ignoreをファイル先頭に)
- ❌ 無効なルール名での抑制(typoサプレッション)
設定
pyproject.toml
[tool.ty.rules]
index-out-of-bounds = "warn"
unused-ignore-comment = "error"
設定優先順位
- コマンドラインオプション
ty.toml(プロジェクト)
pyproject.toml の [tool.ty]
- ユーザー設定(~/.config/ty/)
References