How to type result based on constructor parameters?
まだ誰も着手していません。
- 主要言語
- Python
- スター
- 20.6k
- フォーク
- 3.3k
- PR マージ指標
- PR 指標を取得中
説明
I am trying to type code like this:
class A:
def __init__(self, return_tuple=False):
self.return_tuple = return_tuple
def __call__(self):
if self.return_tuple:
return (1, 2)
return 1
I have tried to make A generic and use overloads on the self parameter in several ways but none seems to work:
class A(Generic[T]):
def __init__(self, return_tuple: T = False) -> None:
self.return_tuple = return_tuple
@overload
def __call__(self: A[Literal[True]]) -> Tuple[int, int]:
pass
@overload
def __call__(self: A[Literal[False]]) -> int
pass
def __call__(self) -> Union[int, Tuple[int, int]]:
if self.return_tuple:
return (1, 2)
return 1
where T is either
T = TypeVar("T", bool)
or
T = TypeVar("T", Literal[True], Literal[False])
The first case mark errors in the definition of the TypeVar, the Generic and the optional parameter in __init__. The second one marks an error only in the optional parameter (even if it is essentially the same type). reveal_type does not have the expected result in both cases.
Am I doing something wrong or is this case just not currently taken into consideration?
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
ファイルやテストは指定されていません。Issue にある Generic[T]、Literal のオーバーロード、コンストラクターのパラメーター、reveal_type の例から始め、mypy がこれらのパターンをどのように処理するかを追跡し、期待される動作を判断してください。完了の条件は、この typing パターンがサポートされているかを明らかにし、関連する制限または要求されている変更を特定することです。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- python
- 領域
- devtools
- issue の種類
- 機能追加
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 活発さ
- 停滞
- 明瞭さ
- 説明が足りない
- 初心者へのやさしさ
- 25/100