Support caching target attributes in Proxy to avoid resolving when using hash() or isinstance()
#551
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.
Description
This PR adds the
cache_defaultsandtargetparameters toProxy. When used together, the proxy caches default values of__class__and__hash__so thathash(proxy)andisinstance(proxy, ...)can be used without needing the resolve the proxy. Thepopulate_targetflag ofStoremethods now defaults to also settingcache_defaults=True.Because this change added more special attributes to the
Proxyclass, I renamed all special attributes (__wrapped__,__factory__,__resolved__, etc.) to be prefixed by__proxy_*to better distinguish what is a property ofProxyversus the target. This is not considered a breaking change because those properties are an internal implementation detail of theProxyclass.Fixes
hashandisinstancethat does not resolve aProxy#549Type of Change
Testing
Added new unit tests for the features.
I also validated against this Dask example:
Here, when
populate_target=False, the proxy will be resolved three times: on the client when the proxy is serialized, on the scheduler when Dask does its input management, and on the worker when the proxy is actually used. Withpopulate_target=True, the proxy is only resolved once on the worker when actually used.Pull Request Checklist
Please confirm the PR meets the following requirements.
pre-commit(e.g., mypy, ruff, etc.).