use ParamSpec for pytest.skip instead of __call__ Protocol attribute #13445
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 more canonical way of typing generic callbacks/decorators
(see https://mypy.readthedocs.io/en/stable/protocols.html#callback-protocols)
This helps with potential issues/ambiguity with
__call__
semanics in type checkers -- according to python spec,__call__
needs to be present on the class, rather than as an instance attribute to be considered callable.This worked in mypy because it didn't handle the spec 100% correctly (in this case this has no negative consequences)
However,
ty
type checker is stricter/more correct about it and everypytest.skip
usage results in:error[call-non-callable]: Object of type _WithException[Unknown, <class 'Skipped'>] is not callable
For more context, see:
Protocol[]
as generic astral-sh/ruff#17832 (comment)Testing:
Tested with running mypy against the following snippet:
Before the change:
After the change:
All types are matching and propagated correctly.