Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make logic around bind_self() consistent in different code paths #8021

Merged
merged 2 commits into from
Nov 27, 2019

Conversation

ilevkivskyi
Copy link
Member

Fixes #8020

There is a bunch of code/logic duplication around bind_self(), mostly because of #7724. This PR makes all three main code paths consistently follow the same structure:

  1. freshen_function_type_vars()
  2. bind_self()
  3. expand_type_by_instance(..., map_instance_to_supertype()) (a.k.a map_type_from_supertype())

I briefly scrolled through other code paths, and it looks like this was last major/obvious inconsistency (although code around __getattr__/__setattr__/__get__/__set__ looks a bit suspicious).

Copy link
Collaborator

@JukkaL JukkaL left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the quick fix!

@ilevkivskyi ilevkivskyi merged commit 1122fc6 into python:master Nov 27, 2019
@ilevkivskyi ilevkivskyi deleted the freshen-classmethod branch November 27, 2019 17:42
ilevkivskyi added a commit that referenced this pull request Nov 29, 2019
This is a follow up for #8021, that applies the fix also to non-callable types. Currently non-callable types are still wrong:
```python
R = TypeVar('R')
T = TypeVar('T')
# Can be any decorator that makes type non-callable.
def classproperty(f: Callable[..., R]) -> R: ...

class C(Generic[T]):
    @classproperty
    def test(self) -> T: ...

x: C[int]
y: Type[C[int]]
reveal_type(x.test)  # Revealed type is 'int', OK
reveal_type(y.test)  # Revealed type is 'T' ???
```

So, #7724 strikes again. It turns out there is not only duplicated logic for attribute kinds (decorators vs normal methods), but also for callable vs non-callable types. In latter case we still need to expand the type (like in other places, e.g., `analyze_var`).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Detect unsupported use of self types in generic classes
2 participants