(🐞) No error for incorrect variance on parameter with generic type
オープン
まだ誰も着手していません。
bug
topic-type-variables
- 主要言語
- Python
- スター
- 20.6k
- フォーク
- 3.3k
- PR マージ指標
- PR 指標を取得中
説明
from typing import TypeVar, Generic
T_in = TypeVar("T_in", contravariant=True)
T_out = TypeVar("T_out", covariant=True)
class AOut(Generic[T_out]): ...
class AIn(Generic[T_in]): ...
class BOut(Generic[T_out]):
def f(self, a_out: AOut[T_out]) -> None: ... # no error
class BIn(Generic[T_in]):
def f(self, a_out: AIn[T_in]) -> None: ... # no error
Mypy in real life
from typing import TypeVar, Generic, Callable
T_in = TypeVar("T_in", contravariant=True)
T_out = TypeVar("T_out", covariant=True)
class AOut(Generic[T_out]):
T: T_out
def f(self, fn: Callable[[], T_out]) -> None:
self.t = fn()
def dump(self) -> T_out:
return self.t
class AIn(Generic[T_in]):
t: T_in
def load(self, t: T_in) -> None:
self.t = t
def f(self, fn: Callable[[T_in], object]) -> None:
fn(self.t)
o1: AOut[int]
o: AOut[object] = o1
o.f(lambda: "")
o1.dump() + 1 # runtime error
i1: AIn[object]
i: AIn[int] = i1
i1.load("")
i.f(lambda x: x + 1) # runtime error
related: #734, #8191
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
issue 内の 2 つの再現例に対して mypy を実行し、無効な variance の使用でエラーが発生しないことを確認してください。ジェネリックな variance チェックのエントリーポイントを追跡し、共変と反変の両方のケースを対象とする回帰テストを追加してください。mypy が期待されるエラーを報告し、正しい variance の使用を壊さなければ完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- python
- 領域
- devtools
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 35/100