Crash while hashing a callable type

Open
#4,601 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
25/100
Issue type
Bug
Clarity
Needs clarification
Activity status
Stale
Tech stack
python
Domain
compilers

Research direction

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.

Written by the indexing model from the issue text.

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).

Dominant language
Python
Stars
20.6k
Forks
3.3k
Avg merge
1d 18h
Merged PRs (30d)
54

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from python/mypy

All issues in python/mypy

Similar issues

More Python issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.