From 11a0052eb5b0fef5fcba836f55394c668a90ac3a Mon Sep 17 00:00:00 2001 From: Greg Ward Date: Wed, 18 Nov 2020 14:15:37 -0500 Subject: [PATCH 1/2] Fix incorrect type hint for 'lexer' argument to Lark constructor The code is crystal clear: assert lexer in ('standard', ...) or issubclass(lexer, Lexer) But the type hint said that lexer must be an _instance_ of Lexer, not a subclass. This change fixes it to require a subclass of Lexer. --- lark-stubs/lark.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lark-stubs/lark.pyi b/lark-stubs/lark.pyi index 8363a5d..7dc8626 100644 --- a/lark-stubs/lark.pyi +++ b/lark-stubs/lark.pyi @@ -63,7 +63,7 @@ class Lark: *, start: Union[None, str, List[str]] = "start", parser: Literal["earley", "lalr", "cyk"] = "auto", - lexer: Union[Literal["auto", "standard", "contextual", "dynamic", "dynamic_complete"], Lexer] = "auto", + lexer: Union[Literal["auto", "standard", "contextual", "dynamic", "dynamic_complete"], Type[Lexer]] = "auto", transformer: Optional[Transformer] = None, postlex: Optional[PostLex] = None, ambiguity: Literal["explicit", "resolve"] = "resolve", From 68e5e86b5ba84edd3e92f9ba16aca1bb8174e72c Mon Sep 17 00:00:00 2001 From: Greg Ward Date: Wed, 18 Nov 2020 14:34:01 -0500 Subject: [PATCH 2/2] Add missing type hint for Token constructor mypy thinks that Token's __init__ is inherited from __str__(). That's not wrong -- it's just irrelevant, because Token also implements __new__(). Token's _effective_ constructor signature is determined by its __new__() method, so that's what I have used in the type hint. Not clear if 'value' is supposed to be Any, but that's what I need in my application. And it works just fine! --- lark-stubs/lexer.pyi | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lark-stubs/lexer.pyi b/lark-stubs/lexer.pyi index 12d3dfe..a654b0f 100644 --- a/lark-stubs/lexer.pyi +++ b/lark-stubs/lexer.pyi @@ -85,6 +85,9 @@ class Token(str): end_column: int end_pos: int + def __init__(self, type_: str, value: Any, pos_in_stream: int = None, line: int = None, column: int = None, end_line: int = None, end_column: int = None, end_pos: int = None): + ... + def update(self, type_: Optional[str] = None, value: Optional[str] = None) -> Token: ...