mypy infers the wrong type for classmethods

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

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

評価

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

調査の方向性

Start with the simplified classmethod example and compare mypy's inferred type for hi with the classmethod annotation in typeshed's stdlib/3/builtins.pyi. Trace the callable inference path to determine whether the real classmethod type can be preserved, and use a focused regression test for the __func__ access as the completion check.

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

説明

bug topic-descriptors topic-runtime-semantics

We have some code that simplifies to this:

class A:
    @classmethod
    def hi(cls):
        pass

    bye = classmethod(hi.__func__)

(The real code is wrapping an async classmethod with a sync version; there's another async-to-sync wrapper in there.)

Mypy doesn't like this code because it doesn't know that classmethods have a __func__ attribute. The typeshed annotation for classmethod includes __func__, but mypy doesn't infer the real classmethod type for hi (which is the actual type at runtime), it just infers a general callable type.

This may not be easily fixed until we have protocol support and can more easily have various callable subtypes?

I'm also OK if this is closed as "just use cast() if you're accessing private attributes of a classmethod"; it's certainly not high priority.

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

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

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

はじめの一歩

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

python/mypy のほかの issue

python/mypy の issue をすべて見る

似ている issue

Python の issue をもっと見る

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

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