style: use `@overload` to get rid of mypy only assertions

This commit is contained in:
lovetheguitar 2024-06-20 23:05:22 +02:00
parent 15c33fbaa3
commit 04f457c4f4
1 changed files with 10 additions and 2 deletions

View File

@ -25,8 +25,10 @@ import keyword
import re import re
import types import types
from typing import Iterator from typing import Iterator
from typing import Literal
from typing import Mapping from typing import Mapping
from typing import NoReturn from typing import NoReturn
from typing import overload
from typing import Protocol from typing import Protocol
from typing import Sequence from typing import Sequence
@ -132,6 +134,14 @@ class Scanner:
) )
yield Token(TokenType.EOF, "", pos) yield Token(TokenType.EOF, "", pos)
@overload
def accept(self, type: TokenType, *, reject: Literal[True]) -> Token: ...
@overload
def accept(
self, type: TokenType, *, reject: Literal[False] = False
) -> Token | None: ...
def accept(self, type: TokenType, *, reject: bool = False) -> Token | None: def accept(self, type: TokenType, *, reject: bool = False) -> Token | None:
if self.current.type is type: if self.current.type is type:
token = self.current token = self.current
@ -208,7 +218,6 @@ BUILTIN_MATCHERS = {"True": True, "False": False, "None": None}
def single_kwarg(s: Scanner) -> ast.keyword: def single_kwarg(s: Scanner) -> ast.keyword:
keyword_name = s.accept(TokenType.IDENT, reject=True) keyword_name = s.accept(TokenType.IDENT, reject=True)
assert keyword_name is not None # for mypy
if not keyword_name.value.isidentifier() or keyword.iskeyword(keyword_name.value): if not keyword_name.value.isidentifier() or keyword.iskeyword(keyword_name.value):
raise ParseError( raise ParseError(
keyword_name.pos + 1, keyword_name.pos + 1,
@ -220,7 +229,6 @@ def single_kwarg(s: Scanner) -> ast.keyword:
value: str | int | bool | None = value_token.value[1:-1] # strip quotes value: str | int | bool | None = value_token.value[1:-1] # strip quotes
else: else:
value_token = s.accept(TokenType.IDENT, reject=True) value_token = s.accept(TokenType.IDENT, reject=True)
assert value_token is not None # for mypy
if ( if (
(number := value_token.value).isdigit() (number := value_token.value).isdigit()
or number.startswith("-") or number.startswith("-")