Skip to content

Commit

Permalink
Fix typing issues around Range/RangeValue (#1196)
Browse files Browse the repository at this point in the history
In order for the `_RangeValue` protocol to type check properly, it needs to
reference `Self`, not itself.

Both pyright and mypy show a ton of errors when type checking this before these
changes. (I've omitted non-relevant errors here):

```
% pyright tests/test_types.py
/Users/dmcgee/projects/sbl/asyncpg/tests/test_types.py
  /Users/dmcgee/projects/sbl/asyncpg/tests/test_types.py:18:25 - error: Argument of type "Literal[1]" cannot be assigned to parameter "lower" of type "_RV@Range | None" in function "__init__"
    Type "Literal[1]" is not assignable to type "_RV@Range | None"
      Type "Literal[1]" is not assignable to type "_RangeValue"
        "Literal[1]" is incompatible with protocol "_RangeValue"
          "__lt__" is an incompatible type
            Type "(value: int, /) -> bool" is not assignable to type "(__other: _RV@__lt__, /) -> bool"
          "__gt__" is an incompatible type
            Type "(value: int, /) -> bool" is not assignable to type "(__other: _RV@__gt__, /) -> bool"
      "Literal[1]" is not assignable to "None" (reportArgumentType)
  /Users/dmcgee/projects/sbl/asyncpg/tests/test_types.py:18:34 - error: Argument of type "Literal[5]" cannot be assigned to parameter "upper" of type "_RV@Range | None" in function "__init__"
    Type "Literal[5]" is not assignable to type "_RV@Range | None"
      Type "Literal[5]" is not assignable to type "_RangeValue"
        "Literal[5]" is incompatible with protocol "_RangeValue"
          "__lt__" is an incompatible type
            Type "(value: int, /) -> bool" is not assignable to type "(__other: _RV@__lt__, /) -> bool"
          "__gt__" is an incompatible type
            Type "(value: int, /) -> bool" is not assignable to type "(__other: _RV@__gt__, /) -> bool"
      "Literal[5]" is not assignable to "None" (reportArgumentType)
...

% mypy tests/test_types.py | grep arg-type
tests/test_types.py:18: error: Argument "lower" to "Range" has incompatible type "int"; expected "None"  [arg-type]
tests/test_types.py:18: error: Argument "upper" to "Range" has incompatible type "int"; expected "None"  [arg-type]
... (19 more errors)
```

After this change, the type checking comes back clean:

```
% pyright tests/test_types.py
0 errors, 0 warnings, 0 informations

% mypy tests/test_types.py | grep arg-type
<no output>
```
  • Loading branch information
toofishes authored Dec 18, 2024
1 parent e9bb695 commit d0797f1
Showing 1 changed file with 2 additions and 2 deletions.
4 changes: 2 additions & 2 deletions asyncpg/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,10 +63,10 @@ class _RangeValue(typing.Protocol):
def __eq__(self, __value: object) -> bool:
...

def __lt__(self, __other: _RangeValue) -> bool:
def __lt__(self, __other: Self, /) -> bool:
...

def __gt__(self, __other: _RangeValue) -> bool:
def __gt__(self, __other: Self, /) -> bool:
...


Expand Down

0 comments on commit d0797f1

Please sign in to comment.