@@ -59,11 +59,12 @@ def literal_eval(node_or_string):
59
59
node_or_string = parse (node_or_string , mode = 'eval' )
60
60
if isinstance (node_or_string , Expression ):
61
61
node_or_string = node_or_string .body
62
+ def _raise_malformed_node (node ):
63
+ raise ValueError (f'malformed node or string: { node !r} ' )
62
64
def _convert_num (node ):
63
- if isinstance (node , Constant ):
64
- if type (node .value ) in (int , float , complex ):
65
- return node .value
66
- raise ValueError ('malformed node or string: ' + repr (node ))
65
+ if not isinstance (node , Constant ) or type (node .value ) not in (int , float , complex ):
66
+ _raise_malformed_node (node )
67
+ return node .value
67
68
def _convert_signed_num (node ):
68
69
if isinstance (node , UnaryOp ) and isinstance (node .op , (UAdd , USub )):
69
70
operand = _convert_num (node .operand )
@@ -82,6 +83,8 @@ def _convert(node):
82
83
elif isinstance (node , Set ):
83
84
return set (map (_convert , node .elts ))
84
85
elif isinstance (node , Dict ):
86
+ if len (node .keys ) != len (node .values ):
87
+ _raise_malformed_node (node )
85
88
return dict (zip (map (_convert , node .keys ),
86
89
map (_convert , node .values )))
87
90
elif isinstance (node , BinOp ) and isinstance (node .op , (Add , Sub )):
0 commit comments