有没有方法在ast.literal_eval中使用range()?
或者换个问法,我想知道有没有一种字面量(literal),可以用literal_eval来得到和range函数一样的效果(而不需要把整个数组作为范围传入)。
下面这个:
import ast
ast.literal_eval("range(0,3)")
ast.literal_eval("[0, 1, 2, 3][0:3]")
会得到:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.7/ast.py", line 80, in literal_eval
return _convert(node_or_string)
File "/usr/lib64/python2.7/ast.py", line 79, in _convert
raise ValueError('malformed string')
ValueError: malformed string
虽然这样是可行的,但它会把整个数组先转换成字符串,然后再转换回来,这样并不理想。我希望能有一种用[0:3]这种语法的方法,而不需要最开始的列表。
>>> ast.literal_eval(str(range(0,3)))
[0, 1, 2]
1 个回答
4
http://docs.python.org/library/ast.html#ast.literal_eval
ast.literal_eval(node_or_string)
这个函数可以安全地评估一个表达式节点或者一个包含Python表达式的字符串。你提供的字符串或节点只能包含以下几种Python的基本数据结构:字符串、数字、元组、列表、字典、布尔值和None。
范围(除了明确指定的列表)不属于这些基本数据结构,所以不可以。