2012-08-23 3 views
8

Sto provando a scrivere una classe BitArray e sarebbe bello avere qualcosa come l'array di numpy, x[i:j:k] = val.Fetta estesa in python?

Come scrivere in Python? Non con lo __setslice__, giusto? Perché questo richiede solo tre argomenti e io ne ho bisogno di uno per prendere quattro.

+0

Quali quattro argomenti vuoi passare? – cyroxx

risposta

5

__setslice__ è deprecato - ti consigliamo di utilizzare __setitem__ con un argomento slice.

Si noti che, per il Python documentation, fette può essere fatto solo nelle seguenti forme sintattiche: a[i:j:step], a[i:j, k:l] o a[..., i:j]. La sintassi basata sui due punti viene utilizzata per definire un singolo oggetto slice, ma come mostra il secondo esempio è possibile avere più argomenti slice (vengono passati come una tupla di slice).

Ecco un esempio che stampa l'argomento key, per vedere la sua forma:

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

C'è un codice di esempio nella parte inferiore di http://docs.python.org/release/2.3.5/whatsnew/section-slices.html che in realtà è ancora utile per questi scopi; esso (più o meno) documenta il metodo 'indices' degli oggetti' non documentati 'altrimenti, senza il quale implementare un 'setitem' completamente generale su slice è piuttosto difficile. –

1

__setslice__ è deprecato, vedere la Python 3 changelog:

__getslice__(), __setslice__() e __delslice__() sono stati uccisi. La sintassi a[i:j] ora si traduce in a.__getitem__(slice(i, j)) (o __setitem__() o __delitem__(), se utilizzato rispettivamente come destinazione di assegnazione o eliminazione).

Allo stesso modo, è possibile passare un valore di passo a slice() che significa che la sintassi a[i:j:k] traduce a.__getitem__(slice(i, j, k)).