python / python/mypy

(🐞) `staticmethod` special-casing causes error to not be reported

Ouverte
#16,161 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

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

Description

If we copy the implementation of staticmethod from typeshed, mypy correctly reports the error here.

So it seems that mypys dedicated special-casing of staticmethod is causing this issue to be incorrectly not reported.

from collections.abc import Callable
from typing import Generic, ParamSpec, TypeVar, overload

P = ParamSpec("P")
T = TypeVar("T")
R_co = TypeVar("R_co", covariant=True)


def contextmanager(fn: Callable[P, R_co]) -> Callable[P, R_co]:
    def func(*args: P.args, **kwargs: P.kwargs) -> R_co:
        return fn(*args, **kwargs)
    return func


class staticmethod_copy(Generic[P, R_co]):
    @property
    def __func__(self) -> Callable[P, R_co]: ...
    @property
    def __isabstractmethod__(self) -> bool: ...
    def __init__(self, __f: Callable[P, R_co]) -> None: ...
    @overload
    def __get__(self, __instance: None, __owner: type) -> Callable[P, R_co]: ...
    @overload
    def __get__(self, __instance: T, __owner: type[T] | None = None) -> Callable[P, R_co]: ...
    __name__: str
    __qualname__: str
    @property
    def __wrapped__(self) -> Callable[P, R_co]: ...
    def __call__(self, *args: P.args, **kwargs: P.kwargs) -> R_co: ...

# Just the relevant part of staticmethod definition that is needed
#class staticmethod(Generic[P, R_co]):
#    def __init__(self, __f: Callable[P, R_co]) -> None: ...
#    def __call__(self, *args: P.args, **kwargs: P.kwargs) -> R_co: ...

class Foo:
    @contextmanager
    @staticmethod_copy
    def copy() -> None: ...

    @contextmanager
    @staticmethod
    def native() -> None: ...


Foo().copy()   # ✅ error: Attribute function "copy" with type "Callable[[], None]" does not accept self argument  [misc]
Foo().native()  # ❌no error

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

Reproduire l’exemple fourni et comparer le traitement spécifique de staticmethod prévu par mypy avec l’implémentation copiée de typeshed. Suivre la manière dont les décorateurs et les types de descripteurs sont analysés ; le travail est terminé lorsque mypy signale l’erreur missing-self pour Foo().native() comme il le fait pour Foo().copy().

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

Évaluation

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

Recevez les nouvelles issues par e-mail

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