fix(typing): Resolve mypy==1.11.0 issues in plugin_registry#3487
Merged
fix(typing): Resolve mypy==1.11.0 issues in plugin_registry#3487
mypy==1.11.0 issues in plugin_registry#3487Conversation
10 tasks
This was referenced Jul 20, 2024
dangotbanned
commented
Jul 20, 2024
dangotbanned
commented
Jul 20, 2024
| R = TypeVar("R") | ||
| Plugin = TypeAliasType("Plugin", Callable[..., R], type_params=(R,)) | ||
| PluginT = TypeVar("PluginT", bound=Plugin[Any]) | ||
| IsPlugin = Callable[[object], TypeIs[Plugin[Any]]] |
Member
Author
There was a problem hiding this comment.
As an example of how this could be used.
@runtime_checkable would not be useful as it doesn't check types. Any callable would pass, regardless of the return type.
alt.utils.theme.py
from .plugin_registry import PluginRegistry
from typing import Callable
from typing_extensions import TypeAlias, TypeIs
ThemeType: TypeAlias = Callable[..., dict]
def is_theme_plugin(obj: Callable[..., Any]) -> TypeIs[ThemeType]:
from inspect import signature
from typing import get_origin
sig = signature(obj)
ret = sig.return_annotation
return ret is dict or get_origin(ret) is dict
class ThemeRegistry(PluginRegistry[ThemeType, dict]):
passalt.vegalite.v5.theme.py
from typing import Final
from ...utils.theme import ThemeRegistry, is_theme_plugin
ENTRY_POINT_GROUP: Final = "altair.vegalite.v5.theme"
themes = ThemeRegistry(entry_point_group=ENTRY_POINT_GROUP, plugin_type=is_theme_plugin)
binste
approved these changes
Jul 20, 2024
Contributor
binste
left a comment
There was a problem hiding this comment.
LGTM, thanks for the fix!
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Fixes
Description
The release of Mypy 1.11 introduced stricter typing for
functools.partial.The existing
# type: ignorecomments were no longer sufficient and correcting everything (whilst not breaking all the derived registries) was more complex than I'd like.Hopefully this summary is easier to understand than the diff alone.
Fix
The fix is mostly 2 changes:
assert isinstance(...)to a narrowing functionFor 2, I have added a courtesy deprecation.
No current
altaircode (including tests) used theplugin_typeargument.I don't think
PluginRegistryis intended to be public as it doesn't appear inalt.__all__.The new default has identical behaviour to the previous default
It is also safer as it won't be disabled by optimizations & better adheres to the current typing spec guidance.