From 2d6f92e18cbed07f81d0a06cf99f937e8d1a6e17 Mon Sep 17 00:00:00 2001 From: Alex Hall Date: Sat, 16 Dec 2023 21:06:48 +0200 Subject: [PATCH 1/2] Handle fussy typing._type_check --- eval_type_backport/eval_type_backport.py | 8 +++++++- tests/test_eval_type_backport.py | 6 ++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/eval_type_backport/eval_type_backport.py b/eval_type_backport/eval_type_backport.py index c4b667c..8876e5b 100644 --- a/eval_type_backport/eval_type_backport.py +++ b/eval_type_backport/eval_type_backport.py @@ -131,7 +131,13 @@ def visit_BinOp(self, node) -> ast.BinOp | ast.Subscript: def visit_Subscript(self, node): value_node = self.visit(node.value) - value_val = self.eval_type(value_node) + try: + value_val = self.eval_type(value_node) + except TypeError: + # Likely typing._type_check complaining that the result isn't a type, + # e.g. that it's a plain `Literal`. + # Either way, this probably isn't one of the new generic types that needs replacing. + return self.generic_visit(node) if value_val not in new_generic_types: return self.generic_visit(node) slice_node = self.visit(node.slice) diff --git a/tests/test_eval_type_backport.py b/tests/test_eval_type_backport.py index eb02be6..83fee2a 100644 --- a/tests/test_eval_type_backport.py +++ b/tests/test_eval_type_backport.py @@ -92,6 +92,12 @@ def test_eval_type_backport(): ] ], ) + check_eval('t.Literal[1]', t.Literal[1]) + check_eval('t.Literal[1] | t.Literal[2]', t.Union[t.Literal[1], t.Literal[2]]) + check_eval( + 't.List[t.Literal[1] | t.Literal[2]]', + t.List[t.Union[t.Literal[1], t.Literal[2]]], + ) def test_other_type_error(): From f3b086edc4db1da2eb9ae08b83344b7661e249f7 Mon Sep 17 00:00:00 2001 From: Alex Hall Date: Sat, 16 Dec 2023 21:17:33 +0200 Subject: [PATCH 2/2] python 3.7 doesn't have Literal --- tests/test_eval_type_backport.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tests/test_eval_type_backport.py b/tests/test_eval_type_backport.py index 83fee2a..8dd5bae 100644 --- a/tests/test_eval_type_backport.py +++ b/tests/test_eval_type_backport.py @@ -92,12 +92,13 @@ def test_eval_type_backport(): ] ], ) - check_eval('t.Literal[1]', t.Literal[1]) - check_eval('t.Literal[1] | t.Literal[2]', t.Union[t.Literal[1], t.Literal[2]]) - check_eval( - 't.List[t.Literal[1] | t.Literal[2]]', - t.List[t.Union[t.Literal[1], t.Literal[2]]], - ) + if hasattr(t, 'Literal'): + check_eval('t.Literal[1]', t.Literal[1]) + check_eval('t.Literal[1] | t.Literal[2]', t.Union[t.Literal[1], t.Literal[2]]) + check_eval( + 't.List[t.Literal[1] | t.Literal[2]]', + t.List[t.Union[t.Literal[1], t.Literal[2]]], + ) def test_other_type_error():