-
-
Notifications
You must be signed in to change notification settings - Fork 26.1k
MNT Refactor get_metadata_routing method in MetadataRequest to directly use _get_metadata_request instead #31695
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
MNT Refactor get_metadata_routing method in MetadataRequest to directly use _get_metadata_request instead #31695
Conversation
with pytest.warns(UserWarning, match="`transform` method which consumes metadata"): | ||
rct = RoutingCustomTransformer( | ||
estimator=CustomTransformer() | ||
.set_fit_request(metadata=True) | ||
.set_transform_request(metadata=True) | ||
) | ||
rct.fit_transform(X=[[1]], metadata="metadata") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This test was added to make sure the warning is also shown when a transformer is not a pure consumer (but also a router). It refers to the change in sklearn.base.TransformerMixin.fit_transform
.
def test_default_requests(): | ||
class OddEstimator(BaseEstimator): | ||
def test_class_level_requests(): | ||
class StubEstimator(BaseEstimator): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm renaming OddEstimator
because the old naming implies we are intentionally demonstrating wrong usage, but that's not our purpose here.
@@ -210,19 +210,19 @@ def test_request_type_is_valid(val, res): | |||
|
|||
|
|||
@config_context(enable_metadata_routing=True) | |||
def test_default_requests(): | |||
class OddEstimator(BaseEstimator): | |||
def test_class_level_requests(): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm renaming test_default_requests
because the term "default" is not referring to default / auto routing here and could be mis-understood. What is meant are the class level requests.
Log of my though process (that hopefully helps me move forwards): The de-coupeling of I wonder if we want to fully automate the setting of self requests, or if it should be integrated in Since then I need to pass an object into But potentially, those could both be merged into the same param, since passing |
I understood that this PR cannot do much about the double-handling of |
I've experimented with my above idea to add a self-request automatically to routers, but it fails for routers that are pure routers but not also consumers. Given that, I no longer see a benefit in removing or refining the If that input is done by calling Also, the original change of this PR, the de-tangling of At this point, I am tempted to think this refactoring is complete, unless there is some specific thing that we want to do with This PR makes the code more readable, because we can clearly see if we deal with a consumer based on the method called on an object. It also adds some improvements to the internal and the API docs and personally, it has given me more insights and more ideas for refactorings (which I will open separate PRs for). What is left that I will go through our docs and examples to check whether the right method is used everywhere. I will do that and then un-draft this PR. Do you consider it complete, @adrinjalali? |
@@ -46,15 +45,20 @@ | |||
MetadataRouter | |||
~~~~~~~~~~~~~~ | |||
|
|||
The ``MetadataRouter`` objects are constructed via a `get_metadata_routing` method, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The
MetadataRouter
objects are constructed via aget_metadata_routing
method
@adrinjalali, Do you think it makes sense to rename get_metadata_routing
into get_metadata_router
?
That would be more precise and we spare people to wonder about whether there is a difference between "metadata router" and "metadata routing". In fact, this method returns a MetadataRouter object.
That would be for a new PR and could be done without deprecation (because we are still in experimental stage), I believe?
Consumer-only classes such as simple estimators return a serialized | ||
version of this class as the output of `get_metadata_routing()`. | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That's not true (anymore).
get_routing_for_object()
, _get_metadata_request()
and get_metadata_routing()
all return unserialised output.
@@ -1529,20 +1532,6 @@ def _get_metadata_request(self): | |||
|
|||
return requests | |||
|
|||
def get_metadata_routing(self): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A side effect of this change is that this method won't be displayed in the docs for the consumers anymore. I don't think it's too bad, since we want users to use get_routing_for_object
anyways.
What does this implement/fix? Explain your changes.
This PR de-couples the double-handling of
MetadataRouter
andMetadataRequest
objects in metadata routing ( a bit), by not using theget_metadata_routing
method inMetadataRequest
anymore, but instead to directly use_get_metadata_request
.This change has affect in several parts of our metadata routing implementation and the tests and there simplifies the code and makes it more intuitive to read.
The goal of this PR is to increase maintainability.
While at it, I also:
__metadata_request__*
class attribute into__metadata_request__{method}
and made clear to mention its a class attribute in our internal documentation to make it easier to distinguish it from the_metadata_request
instance attribute present in consumers at first sight