python / python/mypy

How to type result based on constructor parameters?

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

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

主要言語
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?

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

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

はじめの一歩

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

調査の方向性

ファイルやテストは指定されていません。Issue にある Generic[T]、Literal のオーバーロード、コンストラクターのパラメーター、reveal_type の例から始め、mypy がこれらのパターンをどのように処理するかを追跡し、期待される動作を判断してください。完了の条件は、この typing パターンがサポートされているかを明らかにし、関連する制限または要求されている変更を特定することです。

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

評価

技術スタック
python
領域
devtools
issue の種類
機能追加
難易度
5/5
見積もり時間
1週間以上
活発さ
停滞
明瞭さ
説明が足りない
初心者へのやさしさ
25/100

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

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