Introduce a helper function to map types to protocols + fix for dict kwargs false positive #20419
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: #20424
Following my comments in #20416, this PR introduces a new helper function
as_typethat can be used to determine whether a type can be matched to a certain protocol or not.As an example application, I fix a bug in
is_valid_keyword_var_argthat stems from checkingkwargs <: SupportsKeyAndGetItem[str, Any]This check is too eager, because
SupportsKeyAndGetItemis invariant in the key type, it will produce a false positive whenkwargsis for instancedict[Literal["foo", "bar"], int]. The correct test is:Does there exist
T <: strso thatkwargs <: SupportsKeyAndGetItem[T, Any]which can be checked with the new helper function.
Updated tests
I updated
testLiteralKwargsto test:dictargumentMappingargumentSupportsKeyAndGetitemargument