Crash while hashing a callable type

Ouverte
#4,601 2 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Évaluation

Difficulté
4/5
Temps estimé
3-5 jours
Accessibilité débutants
25/100
Type d'issue
Bug
Clarté
À clarifier
Activité
À l'abandon
Stack technique
python
Domaine
compilers

Piste de recherche

Start with the traceback locations in mypy/build.py, especially finish_passes and _patch_indirect_dependencies, then inspect the hash and is_type_obj implementations in mypy/types.py. Reproduce the crash if possible and determine how a callable type reaches hashing with a missing fallback. Done means the crash is prevented and the regression is covered by a test.

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

Description

needs discussion refactoring

Some time ago there appeared a crash ending in:

...
File "[somewhere]/mypy/build.py", line 1954, in finish_passes
    self.type_map())
File "[somewhere]/mypy/build.py", line 1964, in _patch_indirect_dependencies
    types = set(type_map.values())
File "[somewhere]/mypy/types.py", line 938, in __hash__
    return hash(tuple(self.items()))
File "[somewhere]/mypy/types.py", line 839, in __hash__
    return hash((self.ret_type, self.is_type_obj(),
File "[somewhere]/mypy/types.py", line 723, in is_type_obj
    return self.fallback.type.is_metaclass()
AttributeError: 'NoneType' object has no attribute 'type'

There is no repro yet. There however may be a point for a wider discussion: currently most types in mypy are hashable (they have both __hash__ and __eq__) while they are also mutable. Recently there was a discussion on Python-Dev list and some people said this is a bad pattern. I think this is OK in our case (we use hashes to cache is_subtype results).

Langage dominant
Python
Étoiles
20.6k
Forks
3.3k
Merge moyen
1 j 18 h
PR mergées (30 j)
54

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.

Autres issues de python/mypy

Toutes les issues de python/mypy

Issues similaires

Plus d'issues Python

Recevez les nouvelles issues par e-mail

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