facebook / facebook/pyrefly

`bad-argument-type` when using protocols

Open
#3,285 2 comments 0 reactions 0 assignees View on GitHub
quansight typechecking
Dominant language
Rust
Stars
7k
Forks
516
PR merge metrics
No merged PRs in 30d

Description

### Describe the Bug

```py
from typing import TypeVar, Protocol, Callable, Any, Sequence

class NativeExpr: ...

NativeExprT = TypeVar("NativeExprT", bound=NativeExpr)
NativeExprT_co = TypeVar("NativeExprT_co", bound=NativeExpr, covariant=True)

class CompliantExpr(Protocol[NativeExprT_co]): ...

CompliantExprT = TypeVar("CompliantExprT", bound=CompliantExpr[Any], covariant=True)

class SQLExpr(CompliantExpr[NativeExprT], Protocol[NativeExprT]):
@classmethod
def from_elementwise(
cls, func: Callable[[Sequence[NativeExprT]], NativeExprT]
) -> None:
return None

SQLExprT = TypeVar("SQLExprT", bound=SQLExpr[Any], covariant=True)

class CompliantNamespace(Protocol[CompliantExprT]):
@property
def _expr(self) -> type[CompliantExprT]: ...

class SQLNamespace(CompliantNamespace[SQLExprT], Protocol[SQLExprT, NativeExprT_co]):
def foo(self) -> None:
def _func(a: Sequence[NativeExprT_co]) -> NativeExprT_co:
return a[0]

self._expr.from_elementwise(_func)
return None
```

Then:

```console
(scratch) mgorelli@marcoslaptop:~/scratch$ mypy t.py
Success: no issues found in 1 source file
(scratch) mgorelli@marcoslaptop:~/scratch$ pyright t.py
0 errors, 0 warnings, 0 informations
(scratch) mgorelli@marcoslaptop:~/scratch$ zuban check t.py
Success: no issues found in 1 source file
(scratch) mgorelli@marcoslaptop:~/scratch$ ty check t.py
All checks passed!
(scratch) mgorelli@marcoslaptop:~/scratch$ pyrefly check t.py
ERROR Argument `(a: Sequence[NativeExprT_co]) -> NativeExprT_co` is not assignable to parameter `func` with type `(Sequence[NativeExprT]) -> NativeExprT` in function `SQLExpr.from_elementwise` [bad-argument-type]
--> t.py:38:37
|
38 | self._expr.from_elementwise(_func)
| ^^^^^
|
INFO 1 error
```

### Sandbox Link

https://pyrefly.org/sandbox/?project=N4IgZglgNgpgziAXKOBDAdgEwEYHsAeAdAA4CeS4ATrgLYAEALqcROgOZ0Q3G6UN0AVZjABqqSgBo6ABWoNcAY1xQpAYVRQoqbLCkBBdKSkBlGAEcArjHQKYAHXQOHCrXDh0AcqgYQAbjABRfGJKRDpCCKdHdC8ffyCQgToAXkFhMUoACjsQWL9A4MoBHKk8CyxkvPjCgEoHKoLEgH0lFLTiUXFs3O98hKKW3BK6MoqG-qklX3EIDAZkgUorOujnV3dVWmIoWfQGfszZXHklKABtccKBQYBdGrCIwiiHTe4duf6k1KEOjO7X7a7fZXYajTDJAHvPb9M4GUg3Sa4aaUIELJYwFZRFyoNx0YwARQAMgdIUCYZdEgiZHJFMoLr1qpT7g46Ky6AABbFuGgwBgAC1wmBZbMwMDAdDA1BoTRgsB5ewA7hA4DBsug2Rq6C44FIwOUFGF1JptLAzmdTJZrLZ6XFGkUblSKfbhayanQALQAPk8uHQMEQLs1lF5Fko6o8vvsq3QBOJVzaP06WRysc%2BoNw5XBqcKsMMVKmMzmaOWzxs6zopLmXh5cGIqFshxppzOlehVzuAfVbPZIVwHT4pEDovFMsKmRVUDAbq9jGELa2UOBlIekWjXPcser8DrDdbDC3tfrMHNRM%2BVKOJzp2cSUid1yUHaHYoluFw49lU493ojfs7mpFz5NHqNiZKgYQWlYNjHnetzTt%2BDJ2veuB-v%2BQYhmGdCoGcAAMNxRKhdATmAhCjiEhCSrQMpytYDBKiqmRAfqKwEcGDChuGkYgBIIBkMGYBQKQhDyDQUAUAAxDIpB8QJhEYDgBBar6kBsKGvS%2Bk86ASaYMB0HyDAMMQcCIAA9MZvFigJhC8GwxnWMZmCKHAxlKOgymqT4vrGS%2BlCYdM0AmjpLluZQanqn2HnoHAGlkPyvruv4lBwBAvptDkADMhAAIwAEw5A4ZwwJQ1CJXh6DlFwPB8DAmDupgEDBgotptAA5BAbDoLwMDNQ4HUMO6waWPV1XugA1jApDuvWti4qkzUKuI6DdegIAAL7cfWtoAGLQDAFBoFgeBEGQq1AA

### (Only applicable for extension issues) IDE Information

_No response_

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.