2011-09-10 120 views
1

或其他方式问我想是否有一个literal_eval等于范围函数(不发送整个数组作为范围)。有没有办法使用ast.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] 

回答

4

http://docs.python.org/library/ast.html#ast.literal_eval

ast.literal_eval(node_or_string)

安全评估的表达式节点或含有Python表达式的字符串。 提供的字符串或节点可能只包含以下Python文字结构:字符串,数字,元组,列表,字典,布尔值和无。

范围(明确指定的列表除外)不是其中的任何一个,所以不是。

+0

谢谢,希望我错过了一些东西,但我猜不是。 – matt