2016-03-05 48 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()情況下: - 分隔片索引。

相關問題