ソースの型とターゲットの型に関連がない typing.cast の呼び出しを報告します。
ソースの型がターゲットのサブタイプでなく、ターゲットの型もソースのサブタイプでない場合にエラーが報告されます。
このようなキャストは多くの場合、ロジックに問題があることを暗に示しています。片方の型のインスタンスがもう片方のインスタンスであると仮定できず、typing.cast は型を動的に検証しないためです。
このチェックは、理論的に共通の子孫を持つ可能性がある型にも適用されます。
たとえば、継承元がどちらも Top となっている Left と Right という兄弟クラス間のキャストにはフラグが立てられます。これらの間に直接の継承関係がないからです。
例:
from typing import cast
# 型がオーバーラップしていない — ミスの可能性があります
cast(int, "a") # 'str' -> 'int'
cast(list[int], ["a"]) # 'list[str]' -> 'list[int]'
# 推奨される明示的な回避策は "二重キャスト" を使用することです
cast(int, cast(object, "a")) # ok
# 正当なオーバーラップしているケース
cast(int, object()) # 有効なダウンキャスト
cast(object, 1) # 有効なアップキャスト
# list が非変であるため、次のキャストは無効です。 このインスペクションでは現在サポートされていません。
int_list = [1, 2, 3]
cast(list[object], int_list)
このインスペクションは静的な型情報に依存しています。型が不明な場合、警告は報告されません。 ジェネリック型の変性はまだ考慮されていません。