|
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