Free HasTraits subclasses from hashing/comparing by identity #410
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The Traits listener machinery uses weak-key dicts to track some of the bookkeeping for attaching and unattaching dynamic listeners. The intention of the code assumed that
HasTraits
instances kept the Python 2 default__hash__
and__eq__
semantics, which are based on identity, not value. Python 3 has changed those defaults, and there are some places where we do modify__eq__
to do value comparisons (e.g.codetools.contexts
).Here, I introduce a new
WeakIDKeyDict
that mostly works like aweakref.WeakKeyDictionary
, but the key objects are hashed and compared only by their identity and entirely ignore the__hash__
and__eq__
implementations on the keys.This also replaces a usage of
WeakKeyDictionary
in the adaptation framework, which has similar issues, though that part of the framework is deprecated in any case.