mirror of https://github.com/astral-sh/ruff
This fixes a bug @zsol found running ty against pyx. His original repro
is:
```py
class Base:
def __init__(self) -> None: pass
class A(Base):
pass
def foo[T](callable: Callable[..., T]) -> T:
return callable()
a: A = foo(A)
```
The call at the bottom would fail, since we would infer `() -> Base` as
the callable type of `A`, when it should be `() -> A`.
The issue was how we add implicit annotations to `self` parameters.
Typically, we turn it into `self: Self`. But in cases where we don't
need to introduce a full typevar, we turn it into `self: [the class
itself]` — in this case, `self: Base`. Then, when turning the class
constructor into a callable, we would see this non-`Self` annotation and
think that it was important and load-bearing.
The fix is that we skip all implicit annotations when determining
whether the `self` annotation should take precedence in the callable's
return type.
|
||
|---|---|---|
| .. | ||
| annotated.md | ||
| any.md | ||
| callable.md | ||
| deferred.md | ||
| generic_alias.md | ||
| int_float_complex.md | ||
| invalid.md | ||
| literal.md | ||
| literal_string.md | ||
| never.md | ||
| new_types.md | ||
| optional.md | ||
| self.md | ||
| starred.md | ||
| stdlib_typing_aliases.md | ||
| string.md | ||
| union.md | ||
| unsupported_special_forms.md | ||
| unsupported_special_types.md | ||
| unsupported_type_qualifiers.md | ||