ast.literal_eval: 语法错误:解析时意外的EOF

6 投票
1 回答
15936 浏览
提问于 2025-04-17 14:21

当我尝试解析一个空字符串时,我会遇到一个SyntaxError错误。为什么解析一个'foo'时会出现不同的错误呢?在ast.literal_eval的源代码中,只有ValueError是明确抛出的。

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

1 个回答

21

ast模块使用compile函数将源字符串(这个字符串必须是一个表达式)编译成抽象语法树(AST)。

如果源字符串不是一个有效的表达式(比如说是一个空字符串),那么compile就会抛出一个SyntaxError错误。相反,如果源字符串是一个有效的表达式(例如,一个变量名像foo),那么compile会成功执行,但接下来literal_eval可能会因为ValueError而失败。

因此,在使用literal_eval的时候,你应该同时捕获SyntaxErrorValueError这两种错误。

撰写回答