2016-03-05 46 views
1

Green Tree Snakes给出了一个使用ExtSlicean example什么时候在Python的AST中使用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外壳工作:

>>> 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 

任何人有一个想法如何使用此功能?

相关讨论:

+0

你期望'foo [1:2,3]'是什么? – zondo

回答

3

语法在外壳做工精细,它只是list对象不支持扩展切片。您尝试提出TypeError,而不是SyntaxError

许多Numpy数组类型做;该项目有助于推动扩展切片语法。 Numpy数组使用扩展切片来解决多维数组的不同维度。有关如何使用语法的详细信息,请参见Numpy Indexing chapter

扩展切片是explicitly documented in the Subscription section,AST的节点编码extended_slicing项:

​​3210

有Python标准库本身使用扩展切片没有类型,但是。

您可以轻松构建您自己的类来接受扩展切片;只是希望在你的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()情况下: - 分隔片索引。

相关问题