有没有方法在ast.literal_eval中使用range()?

2 投票
1 回答
855 浏览
提问于 2025-04-17 01:57

或者换个问法,我想知道有没有一种字面量(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。

范围(除了明确指定的列表)不属于这些基本数据结构,所以不可以。

撰写回答