Serhiy Storchaka <> added the comment:

The definition of "Python literal structures" is not specified, but it is 
implied that ast.literal_eval() should accept signed numbers and 
tuple/list/set/dict displays consisting of "Python literal structures".

ast.literal_eval() accepts unary minus for supporting negative numbers. In 
Python 2 "-42" was parsed as a single AST node Num(42), but in Python 3 it is 
parsed as UnaryOp(USub(), Num(42)). ast.literal_eval() accepts binary plus and 
minus for supporting complex numbers (there are oddities in this). The support 
of unary plus was added somewhere for unknown reason (see 884c71cd8dc6, no 
issue number), but it doesn't harm.

Below in the documentation: "It is not capable of evaluating arbitrarily 
complex expressions, for example involving operators or indexing." Arbitrarily 
complex expressions involving addition and subtraction (like "2017-10-10") was 
supported in Python 3 (but not in Python 2), but it was fixed in 3.7 (see 
issue31778). It doesn't support other operations or operations with non-numeric 
literals. It is oversight that UnaryOp(USub(), Constant(True)) is still 


Python tracker <>
Python-bugs-list mailing list

Reply via email to