何时在Python的AST中使用ExtSlice节点?

3

绿树蛇提供了一个使用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

有人知道如何使用这个功能吗?

相关讨论:


你期望 foo[1:2,3] 是什么? - zondo
1个回答

6
在shell中,语法没有问题,只是列表对象不支持扩展切片。你尝试的会引发TypeError而不是SyntaxError
许多Numpy数组类型支持;该项目对推动扩展切片语法起了重要作用。Numpy数组使用扩展切片来寻址多维数组的不同维度。有关如何使用该语法的详细信息,请参见Numpy的索引章节
扩展切片在Subscription部分有明确的文档记录,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标准库本身没有使用扩展切片的类型。但是,您可以轻松构建自己的类来接受扩展切片;只需在object.__getitem__()方法实现中处理元组即可。
>>> class Foo(object):
...     def __getitem__(self, item):
...         return item
...
>>> foo = Foo()
>>> foo[1, 2:3]
(1, slice(2, 3, None))
< p > slice_list 的每个元素都成为元组中的一个对象,其中传递了以 : 分隔的切片索引作为 slice() 实例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接