Inconsistent behavior w.r.t missing builtins
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 20.6k
- Forks
- 3.3k
- Métriques de merge des PR
- Métriques de PR en attente
Description
Issue
Some of the builtins fixtures are sparse to the point that they're missing even the declaration of dict, list, tuple etc. types. The austerity is justified by improved tests performance, and it's understood that specific tests can specify a broader fixture without slowing down other tests.
However, some core features rely on the presence of those types, e.g.
- functions'
**kwargs - modules'
__annotations__ namedtuple's attributes like_field_types
I've observed 3 different strategies used to handle the types absence:
- crash (example:
**kwargshandling) - give up (example:
__annotations__not being added) - fallback to
object(example:NamedTupleattributes)
I think we should recommend and, ideally, consolidate on one strategy.
Motivation
Case in point: Recently while implementing #14526, I had to "play" a whack-a-mole with unrelated tests breaking. I've used **kw which required me to add dict to a number of builtins fixtures, which in turn caused __annotations__ to materialize where they didn't before, and failed some other tests.
I think ideally we shouldn't have this whack-a-mole, and tests should be less brittle.
Recommendation
Which strategy to adopt? While it's good practice to structure code to be more testable, I think it's normally discouraged to have code paths that are only due to testing. Since those builtins should universally exist in "production", I think crash should be our strategy.
Since code typically relies only on the presence of those classes (not their methods), we can put in place a rule (validated by tests) that any builtins fixture must define a baseline of types, even if empty. This shouldn't affect performance greatly, and provide a comfortable baseline.
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par comparer la gestion des builtins manquants dans mypy/types.py, mypy/semanal.py et mypy/semanal_namedtuple.py, ainsi que les fixtures et les tests de builtins concernés. Déterminez une stratégie cohérente pour les déclarations de builtins requises et mettez à jour les tests concernés afin que le comportement des fixtures soit stable pour **kwargs, annotations et la gestion de NamedTuple.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- compilers
- Type d'issue
- Refactorisation
- Difficulté
- 5/5
- Temps estimé
- Plus d'une semaine
- Activité
- À l'abandon
- Clarté
- À clarifier
- Accessibilité débutants
- 35/100