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

Fix typing issues around Range/RangeValue #1196

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Commits on Oct 22, 2024

  1. Fix typing issues around Range/RangeValue

    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>
    ```
    toofishes committed Oct 22, 2024
    Configuration menu
    Copy the full SHA
    80502bf View commit details
    Browse the repository at this point in the history