python / python/mypy

attrs plugin does not implement the new attributes collection algorithm

Ouverte
#16,014 0 commentaires 1 réaction 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

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

Description

Bug Report

The attrs plugin does not implement the new attributes collection algorithm that is enabled with @attr.s(collect_by_mro=True) in the old API and is the only option in the new API.

To Reproduce

(mypy-play.net does not have stubs for attrs)

from attrs import define, field

@define
class A:
    f: int = field(kw_only=True)

@define
class B(A):
    pass

@define
class C(A):
    f: int = field()

@define
class D(B, C):
    pass

# D(f: int) for attrs.define, but D(*, f: int) for attr.s
d = D(123)
print(d.f)

Expected Behavior

The signature for D should be D(f: int), so this should type check. It works fine at run time.

Actual Behavior

attrs_mro.py:20: error: Too many positional arguments for "D"  [misc]

I get the same error if I replace @define and field with @attrs(collect_by_mro=True) and attrib from the old namespace respectively. Note that this behavior is correct when @attrs is used without collect_by_mro=True.

Your Environment

  • Mypy version used: 1.5.1
  • Python version used: 3.11

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 mypy's attrs plugin et reproduisez l'exemple signalé d'héritage multiple avec attrs.define, field et collect_by_mro=True. Comparez la signature de constructeur inférée au comportement attendu de D(f: int), puis ajoutez ou mettez à jour la couverture afin que l'appel positionnel passe la vérification de types, tout en conservant le comportement existant de non-collect_by_mro.

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.