2012-08-23 49 views
8

我正在嘗試寫一個BitArray類,它會很漂亮,像numpy的數組,x[i:j:k] = valpython中的擴展切片?

我該如何在Python中編寫它?不與__setslice__,對不對?因爲這隻需要三個參數,我需要一個取四個。

+0

什麼四個參數你想傳遞? – cyroxx

回答

5

__setslice__已棄用 - 您需要使用帶有slice參數的__setitem__

請注意,根據Python documentation,切片只能按以下語法格式完成:a[i:j:step],a[i:j, k:l]a[..., i:j]。基於冒號的語法用於定義單個切片對象,但如第二個示例所示,您可以有多個切片參數(它們作爲切片元組傳遞)。

這裏的打印出key說法,看它的形式一個例子:

>>> class Foo(object): 
>>>  def __setitem__(self, key, value): 
>>>   print key 
>>> 
>>> a = Foo() 
>>> a[1:1] = 1 
slice(1, 1, None) 
>>> 
>>> a[1:1:1] = 1 
slice(1, 1, 1) 
>>> 
>>> a[1:1, 1:1] = 1 
(slice(1, 1, None), slice(1, 1, None)) 
+1

http://docs.python.org/release/2.3.5/whatsnew/section-slices.html底部有一些示例代碼,實際上這些代碼對於這些目的仍然有用;它(或多或少)記錄了「切片」對象的另外未記錄的「索引」方法,沒有這些方法在切片上實現完全通用的「setitem」相當困難。 –

1

__setslice__已過時,看到Python 3 changelog

__getslice__()__setslice__()__delslice__()被打死。語法a[i:j]現在轉換爲a.__getitem__(slice(i, j))(或__setitem__()__delitem__(),分別用作分配或刪除目標時)。

類似地,可以將步驟值傳遞給slice()這意味着語法a[i:j:k]轉換爲a.__getitem__(slice(i, j, k))