python / python/mypy

Mypy doesn't detect new metaclass on subclass

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

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

bug
主要言語
Python
スター
20.6k
フォーク
3.3k
PR マージ指標
PR 指標を取得中

説明

Bug Report

If you subclass a class with a metaclass but change the metaclass to your own with a different method signature, mypy does not pick up on that.

To Reproduce

Example:

from enum import EnumType, StrEnum as _StrEnum, auto

class EnumMeta(EnumType):
  def __call__(cls, value=None, **kwargs):
    # Return first enum if value is None
    if value is None:
      value = next(iter(cls))
    return super().__call__(value, **kwargs)


class StrEnum(_StrEnum, metaclass=EnumMeta):
  @staticmethod
  def _generate_next_value_(name, *args):
    # auto() defaults to name.lower()
    return name


class FingerprintSource(StrEnum):
  can = auto()
  fw = auto()
  fixed = auto()


FingerprintSource()

Out: <FingerprintSource.can: 'can'>

Expected Behavior

Mypy passes

Actual Behavior

selfdrive/car/data_structures.py:310: error: Missing positional argument "value" in call to "FingerprintSource"  [call-arg]

Your Environment

mypy 1.11.1 (compiled: yes)
Python 3.11.4

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

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

はじめの一歩

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

調査の方向性

まず、提供された Python の例を mypy 1.11.1 で実行し、誤って報告される引数不足エラーを確認します。次に、サブクラスが EnumMeta を宣言している場合に、mypy が FingerprintSource の呼び出し可能なシグネチャをどのように決定するかを追跡します。このケースに対する集中的なカバレッジを追加し、例がそのエラーなしで型チェックを通過することを確認します。

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

評価

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

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

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