`super().__new__` inherited from Tuple doesn't match element type
まだ誰も着手していません。
- 主要言語
- Python
- スター
- 20.6k
- フォーク
- 3.3k
- PR マージ指標
- PR 指標を取得中
説明
Hi, when I inherit from Tuple[float, float, float], and pass a tuple of floats as an argument to super().__new__, I get an error saying that an Iterable[_T_co] was expected instead. As per the typeshed stub, _T_co is supposed to be the type of the tuple elements, so I guess it's not getting deduced correctly. Further, this works with tuple.__new__, so the involvement of super() must be to blame and the type signatures indeed aren't identical.
from typing import Tuple, Type, TypeVar
CoordsT = TypeVar('CoordsT', bound='Coords')
class Coords(Tuple[float, float, float]):
def __new__(cls: Type[CoordsT]) -> CoordsT:
reveal_type(super().__new__)
# Revealed type is 'def [_T] (cls: Type[_T`-1], iterable: typing.Iterable[_T_co`1] =) -> _T`-1'
reveal_type(tuple.__new__)
# Revealed type is 'def [_T_co, _T] (cls: Type[_T`-1], iterable: typing.Iterable[_T_co`1] =) -> _T`-1'
value = (0.0, 0.0, 0.0)
result = tuple.__new__(cls, value)
# fine
super().__new__(cls, value)
# error: Argument 2 to "__new__" of "tuple" has incompatible type "Tuple[float, float, float]"; expected "Iterable[_T_co]"
return result
I'm not sure if it's mypy or typeshed that is responsible for the function signature of super's __new__, but I didn't find an overload for it in typeshed, so I suspect this is mypy's remit
Edit: mypy 0.770, Python 3.7.3
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
再現コードから始め、super().__new__ と tuple.__new__ について明らかになった型を比較します。参照されている typeshed の builtins.pyi のシグネチャを調べ、続いて mypy が継承された __new__ の呼び出しをどのように処理するかを追跡します。示されている super().__new__(cls, value) の呼び出しが、報告された型エラーなしで浮動小数点数のタプルを受け入れれば完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- python
- 領域
- devtools
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 35/100