mirror of
https://github.com/astral-sh/ruff
synced 2026-01-20 21:10:48 -05:00
## Summary This PR checks whether two callable types are equivalent or not. This is required because for an equivalence relationship, the default value does not necessarily need to be the same but if the parameter in one of the callable has a default value then the corresponding parameter in the other callable should also have a default value. This is the main reason a manual implementation is required. And, as per https://typing.python.org/en/latest/spec/callables.html#id4, the default _type_ doesn't participate in a subtype relationship, only the optionality (required or not) participates. This means that the following two callable types are equivalent: ```py def f1(a: int = 1) -> None: ... def f2(a: int = 2) -> None: ... ``` Additionally, the name of positional-only, variadic and keyword-variadic are not required to be the same for an equivalence relation. A potential solution to avoid the manual implementation would be to only store whether a parameter has a default value or not but the type is currently required to check for assignability. ## Test plan Add tests for callable types in `is_equivalent_to.md`