python / python/mypy

Mypyc runtime TypeError exceptions when you change inherited method to a staticmethod

Ouverte
#19,558 3 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

bug topic-mypyc
Langage dominant
Python
Étoiles
20.6k
Forks
3.3k
Métriques de merge des PR
Métriques de PR en attente

Description

Crash Report

Using mypyc to compile an ABC subclass with @classmethod and implement it in a subclass as @staticmethod leads to runtime type exceptions.

checkers_minimax.py

from abc import ABC


class State:
    """State object."""


class MinimaxWithTT(ABC):
    @classmethod
    def terminal(cls, state: State) -> bool:
        return False

    def alphabeta_transposition_table(
        self,
        state: State,
    ) -> None:
        print(f"Just before crash {type(state) = }")
        self.terminal(state)


class CheckersMinimax(MinimaxWithTT):
    @staticmethod
    def terminal(state: State) -> bool:
        return False


def run() -> None:
    mm = CheckersMinimax()
    mm.alphabeta_transposition_table(State())


if __name__ == "__main__":
    run()
mypyc checkers_minimax.py
python -c "from checkers_minimax import run; run()"

Traceback

Traceback (most recent call last):
  File "<string>", line 1, in <module>
    from checkers_minimax import run; run()
                                      ~~~^^
  File "checkers_minimax.py", line 29, in run
    mm.alphabeta_transposition_table(State())
  File "checkers_minimax.py", line 18, in alphabeta_transposition_table
    self.terminal(state)
TypeError: checkers_minimax.State object expected; got abc.ABCMeta

To Reproduce

See above

Your Environment

  • Mypy version used: mypy 1.17.1 (compiled: yes)
  • Mypy command-line flags: See above
  • Mypy configuration options from mypy.ini (and other config files): None
  • Python version used: Python 3.13.3 (main, Jun 16 2025, 18:15:32) [GCC 14.2.0] on linux
  • Operating system and version:
> uname -a
Linux ideapad 6.14.0-24-generic #24-Ubuntu SMP PREEMPT_DYNAMIC Sun Jun 15 11:18:07 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
  • GCC version
> x86_64-linux-gnu-gcc --version
x86_64-linux-gnu-gcc (Ubuntu 14.2.0-19ubuntu2) 14.2.0
...

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par la reproduction dans checkers_minimax.py et exécutez la commande mypyc documentée, suivie de l’invocation de Python. Suivez la manière dont mypyc traite le classmethod hérité redéfini en staticmethod ; le travail est terminé lorsque le programme compilé s’exécute sans le TypeError signalé et que la régression est couverte par un test approprié.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
python
Domaine
compilers, devtools
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.