[Draft] Recursion support for observe #1242
Closed
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.
This is a draft PR that will be closed immediately. This is created solely for future reference and to keep a record for work that was done before.
Background: In the two proof-of-concept PRs for the observe framework (#942 and #969), recursion support was experimented with because
on_trait_change
does have this support. The feature was excluded for it is not clear if there is indeed a need, and the implementation isn't trivial.The main difficulties are:
ObserverGraph
containing cycles from an expression (e.g. in the mini-language"a.[b,c]*"
). This requires maintaining the identity of objects as the graph is constructed.This implementation does the following:
ObserverGraph
so it keeps track of what are branches and what are cycles.Expression
, keeps track of theObserverGraph
objects in a cache, it is similar to howdeepcopy
handles cycle references.Important note:
ObserverGraph
was hashing its children graphs too early and the hash was persisted. It is important that during the process of constructing the observer graph with cycles, the hashes of the intermediate observer graphs are never used or persisted.Checklist
Update API reference (docs/source/traits_api_reference
)Update User manual (docs/source/traits_user_manual
)Update type annotation hints intraits-stubs