何时在 Python 的 AST 中使用 ExtSlice 节点?
When to use ExtSlice node in Python's AST?
Green Tree Snakes gives an example 使用 ExtSlice
:
>>> parseprint("l[1:2, 3]")
Module(body=[
Expr(value=Subscript(value=Name(id='l', ctx=Load()), slice=ExtSlice(dims=[
Slice(lower=Num(n=1), upper=Num(n=2), step=None),
Index(value=Num(n=3)),
]), ctx=Load())),
])
但是这种语法在交互式中不起作用 python shell:
>>> foo = range(10)
>>> foo[1:2,3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list indices must be integers, not tuple
有人知道如何使用此功能吗?
相关讨论:
- What syntax is represented by an ExtSlice node in Python's AST?
语法在shell中工作正常,只是list
对象不行支持扩展切片。你尝试的是 TypeError
,而不是 SyntaxError
。
很多Numpy array types do; that project was instrumental in driving the extended slicing syntax. Numpy arrays use extended slicing to address the different dimensions of multi-dimensional arrays. See the Numpy Indexing chapter了解他们如何使用语法的详细信息。
扩展切片是 explicitly documented in the Subscription section,AST 节点编码 extended_slicing
术语:
extended_slicing ::= primary "[" slice_list "]"
slice_list ::= slice_item ("," slice_item)* [","]
slice_item ::= expression | proper_slice | ellipsis
proper_slice ::= short_slice | long_slice
但是,Python 标准库本身没有使用扩展切片的类型。
您可以轻松构建自己的 class 来接受扩展切片;只希望在您的 object.__getitem__()
method 实现中处理一个元组:
>>> class Foo(object):
... def __getitem__(self, item):
... return item
...
>>> foo = Foo()
>>> foo[1, 2:3]
(1, slice(2, 3, None))
slice_list
的每个元素都成为元组中的对象,:
分隔的切片索引作为 slice()
个实例传入。
Green Tree Snakes gives an example 使用 ExtSlice
:
>>> parseprint("l[1:2, 3]")
Module(body=[
Expr(value=Subscript(value=Name(id='l', ctx=Load()), slice=ExtSlice(dims=[
Slice(lower=Num(n=1), upper=Num(n=2), step=None),
Index(value=Num(n=3)),
]), ctx=Load())),
])
但是这种语法在交互式中不起作用 python shell:
>>> foo = range(10)
>>> foo[1:2,3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list indices must be integers, not tuple
有人知道如何使用此功能吗?
相关讨论:
- What syntax is represented by an ExtSlice node in Python's AST?
语法在shell中工作正常,只是list
对象不行支持扩展切片。你尝试的是 TypeError
,而不是 SyntaxError
。
很多Numpy array types do; that project was instrumental in driving the extended slicing syntax. Numpy arrays use extended slicing to address the different dimensions of multi-dimensional arrays. See the Numpy Indexing chapter了解他们如何使用语法的详细信息。
扩展切片是 explicitly documented in the Subscription section,AST 节点编码 extended_slicing
术语:
extended_slicing ::= primary "[" slice_list "]"
slice_list ::= slice_item ("," slice_item)* [","]
slice_item ::= expression | proper_slice | ellipsis
proper_slice ::= short_slice | long_slice
但是,Python 标准库本身没有使用扩展切片的类型。
您可以轻松构建自己的 class 来接受扩展切片;只希望在您的 object.__getitem__()
method 实现中处理一个元组:
>>> class Foo(object):
... def __getitem__(self, item):
... return item
...
>>> foo = Foo()
>>> foo[1, 2:3]
(1, slice(2, 3, None))
slice_list
的每个元素都成为元组中的对象,:
分隔的切片索引作为 slice()
个实例传入。