python / python/mypy

[PEP 695] Incorrect Variance Computation with `Self | other` return type

オープン
#20,997 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

bug
主要言語
Python
スター
20.6k
フォーク
3.3k
平均マージ
1日 18時間
マージ済み PR(30日)
54

説明

In the example below, FloatScalar is contravariant in FloatT, but mypy thinks it is invariant

from typing import Self

class FloatScalar[FloatT]:  # contravariant
    def pow(self, arg: FloatT) -> Self | complex: ...

def upcast(arg: FloatScalar[object]) -> FloatScalar[float]:
    return arg  # ❌️ Incompatible return value type

https://mypy-play.net/?gist=e9e6d34bee57d1c799b71b0f0573175d

If we remove the union in the return type, inference seems to work as expected:

from typing import Self

class FloatScalar[FloatT]:  # contravariant
    def pow(self, arg: FloatT) -> Self: ...

def upcast(arg: FloatScalar[object]) -> FloatScalar[float]:
    return arg  # ✅️

https://mypy-play.net/?gist=b0a994e8dda1b85ce2a4cf26631f843e

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

リンクされた mypy-play の再現例から始め、Self | complex を追加すると FloatScalar の推論された変性が変わる 2 つの例を比較してください。PEP 695 ジェネリックの変性計算を追跡し、union のケースで FloatScalar[object]FloatScalar[float] として受け入れられることを示すリグレッションテストを追加してください。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
python
領域
compilers, devtools
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
42/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。