Skip to content

Commit 18d1cee

Browse files
author
armin.ronacher
committed
ast.literal_eval can properly evaluate complex numbers now. This fixes issue4907.
git-svn-id: http://svn.python.org/projects/python/trunk@68571 6015fed2-1504-0410-9fe1-9d1591cc4771
1 parent 2cf1ca1 commit 18d1cee

File tree

2 files changed

+23
-0
lines changed

2 files changed

+23
-0
lines changed

Diff for: Lib/ast.py

+12
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,18 @@ def _convert(node):
6464
elif isinstance(node, Name):
6565
if node.id in _safe_names:
6666
return _safe_names[node.id]
67+
elif isinstance(node, BinOp) and \
68+
isinstance(node.op, (Add, Sub)) and \
69+
isinstance(node.right, Num) and \
70+
isinstance(node.right.n, complex) and \
71+
isinstance(node.left, Num) and \
72+
isinstance(node.left.n, (int, long, float)):
73+
left = node.left.n
74+
right = node.right.n
75+
if isinstance(node.op, Add):
76+
return left + right
77+
else:
78+
return left - right
6779
raise ValueError('malformed string')
6880
return _convert(node_or_string)
6981

Diff for: Lib/test/test_ast.py

+11
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,17 @@ def test_literal_eval(self):
271271
self.assertEqual(ast.literal_eval('(True, False, None)'), (True, False, None))
272272
self.assertRaises(ValueError, ast.literal_eval, 'foo()')
273273

274+
def test_literal_eval_issue4907(self):
275+
self.assertEqual(ast.literal_eval('2j'), 2j)
276+
self.assertEqual(ast.literal_eval('10 + 2j'), 10 + 2j)
277+
self.assertEqual(ast.literal_eval('1.5 - 2j'), 1.5 - 2j)
278+
try:
279+
ast.literal_eval('2 + (3 + 4j)')
280+
except ValueError:
281+
pass
282+
else:
283+
self.fail('expected value error')
284+
274285

275286
def test_main():
276287
test_support.run_unittest(AST_Tests, ASTHelpers_Test)

0 commit comments

Comments
 (0)