|
23 | 23 | """simple evaluation of side-effect free code |
24 | 24 |
|
25 | 25 | In order to provide fancy completion, some code can be executed safely. |
26 | | -
|
27 | 26 | """ |
28 | 27 |
|
29 | | - |
30 | 28 | import ast |
31 | 29 | import sys |
32 | 30 | import builtins |
33 | 31 |
|
34 | 32 | from . import line as line_properties |
35 | 33 | from .inspection import getattr_safe |
36 | 34 |
|
| 35 | +_is_py38 = sys.version_info[:2] >= (3, 8) |
| 36 | +_is_py39 = sys.version_info[:2] >= (3, 9) |
| 37 | + |
37 | 38 | _string_type_nodes = (ast.Str, ast.Bytes) |
38 | 39 | _numeric_types = (int, float, complex) |
39 | | -_name_type_nodes = (ast.Name, ast.NameConstant) |
| 40 | +_name_type_nodes = (ast.Name,) if _is_py38 else (ast.Name, ast.NameConstant) |
40 | 41 |
|
41 | 42 |
|
42 | 43 | class EvaluationError(Exception): |
@@ -88,9 +89,9 @@ def simple_eval(node_or_string, namespace=None): |
88 | 89 | def _convert(node): |
89 | 90 | if isinstance(node, ast.Constant): |
90 | 91 | return node.value |
91 | | - elif isinstance(node, _string_type_nodes): |
| 92 | + elif not _is_py38 and isinstance(node, _string_type_nodes): |
92 | 93 | return node.s |
93 | | - elif isinstance(node, ast.Num): |
| 94 | + elif not _is_py38 and isinstance(node, ast.Num): |
94 | 95 | return node.n |
95 | 96 | elif isinstance(node, ast.Tuple): |
96 | 97 | return tuple(map(_convert, node.elts)) |
@@ -149,14 +150,16 @@ def _convert(node): |
149 | 150 | return left - right |
150 | 151 |
|
151 | 152 | # this is a deviation from literal_eval: we allow indexing |
152 | | - elif isinstance(node, ast.Subscript) and isinstance( |
153 | | - node.slice, ast.Index |
| 153 | + elif ( |
| 154 | + not _is_py39 |
| 155 | + and isinstance(node, ast.Subscript) |
| 156 | + and isinstance(node.slice, ast.Index) |
154 | 157 | ): |
155 | 158 | obj = _convert(node.value) |
156 | 159 | index = _convert(node.slice.value) |
157 | 160 | return safe_getitem(obj, index) |
158 | 161 | elif ( |
159 | | - sys.version_info[:2] >= (3, 9) |
| 162 | + _is_py39 |
160 | 163 | and isinstance(node, ast.Subscript) |
161 | 164 | and isinstance(node.slice, (ast.Constant, ast.Name)) |
162 | 165 | ): |
|
0 commit comments