Python的literal_eval表示字符串' a,b,c'是畸形的

时间:2016-11-14 14:46:56

标签: python eval literals

literal_eval文档声明:

  

安全地评估包含Python文字或容器显示的表达式节点或 Unicode 或Latin-1编码的字符串。提供的字符串或节点可能只包含以下Python文字结构:字符串,数字,元组,列表,字符串,布尔值和无。

我想解析一个表示元组的unicode字符串。为什么我会为以下输入获得ValueError: malformed string

print literal_eval(unicode('abc')) 
print literal_eval(unicode('c,d,e'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.5/ast.py", line 84, in literal_eval
    return _convert(node_or_string)
  File "/usr/lib/python3.5/ast.py", line 55, in _convert
    return tuple(map(_convert, node.elts))
  File "/usr/lib/python3.5/ast.py", line 83, in _convert
    raise ValueError('malformed node or string: ' + repr(node))
ValueError: malformed node or string: <_ast.Name object at 0x7f1da47e7860>

但是,此示例确实有效:

print literal_eval(unicode('1,2,3'))
(1, 2, 3)

1 个答案:

答案 0 :(得分:4)

literal_eval仅解析literals。您的字符串是变量名称元组(abccde)。相反,您需要一个字符串元组或一个带逗号的字符串。任何一个都需要两个级别的引号。

# string
print(literal_eval("'abc'"))
'abc'
print(literal_eval("'c,d,e'"))
'c,d,e'

# tuple of strings
print(literal_eval("'c','d','e'"))
('c', 'd', 'e')

你的最后一个例子是一个int元组,它们都是文字,所以它成功解析。