Skip to content

Commit 04a8756

Browse files
authored
[red-knot] Check subtype relation between callable types (#16804)
## Summary Part of #15382 This PR adds support for checking the subtype relationship between the two callable types. The main source of reference used for implementation is https://typing.python.org/en/latest/spec/callables.html#assignability-rules-for-callables. The implementation is split into two phases: 1. Check all the positional parameters which includes positional-only, standard (positional or keyword) and variadic kind 2. Collect all the keywords in a `HashMap` to do the keyword parameters check via name lookup For (1), there's a helper struct which is similar to `.zip_longest` (from `itertools`) except that it allows control over one of the iterator as that's required when processing a variadic parameter. This is required because positional parameters needs to be checked as per their position between the two callable types. The struct also keeps track of the current iteration element because when the loop is exited (to move on to the phase 2) the current iteration element would be carried over to the phase 2 check. This struct is internal to the `is_subtype_of` method as I don't think it makes sense to expose it outside. It also allows me to use "self" and "other" suffixed field names as that's only relevant in that context. ## Test Plan Add extensive tests in markdown. Converted all of the code snippets from https://typing.python.org/en/latest/spec/callables.html#assignability-rules-for-callables to use `knot_extensions.is_subtype_of` and verified the result.
1 parent 193c381 commit 04a8756

File tree

2 files changed

+856
-2
lines changed

2 files changed

+856
-2
lines changed

0 commit comments

Comments
 (0)