6

When trying to parse an empty string I get a SyntaxError. Why does it raise a different error than parsing a 'foo'? In the source of ast.literal_eval only ValueError is explicitly raised.

In [1]: import ast

In [2]: ast.literal_eval('foo')
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-2-d8695a7c4a9f> in <module>()
----> 1 ast.literal_eval('foo')

/usr/lib/python2.7/ast.pyc in literal_eval(node_or_string)
     78                 return left - right
     79         raise ValueError('malformed string')
---> 80     return _convert(node_or_string)
     81 
     82 

/usr/lib/python2.7/ast.pyc in _convert(node)
     77             else:
     78                 return left - right
---> 79         raise ValueError('malformed string')
     80     return _convert(node_or_string)
     81 

ValueError: malformed string

In [3]: ast.literal_eval('')
  File "<unknown>", line 0

    ^
SyntaxError: unexpected EOF while parsing
root
  • 76,608
  • 25
  • 108
  • 120
  • `foo` is valid Python syntax. It's just not a literal. – Fred Foo Jan 31 '13 at 21:01
  • @larsmans -- sounds reasonable, but for some reason I thought that an empty string or whitespace would raise the same exception...also the `File "", line 0` isn't really helpful. – root Jan 31 '13 at 21:05
  • Just whitespace isn't valid according to the expression grammar, hence a syntax error. – Fred Foo Jan 31 '13 at 21:08

1 Answers1

21

ast uses compile to compile the source string (which must be an expression) into an AST.

If the source string is not a valid expression (like an empty string), a SyntaxError will be raised by compile. If, on the other hand, the source string would be a valid expression (e.g. a variable name like foo), compile will succeed but then literal_eval might fail with a ValueError.

Therefore, you should catch both SyntaxError and ValueError when using literal_eval.

nneonneo
  • 171,345
  • 36
  • 312
  • 383