2012-08-23 20 views
8

Ich versuche, eine BitArray-Klasse zu schreiben, und es wäre geschickt, etwas wie numpys Array zu haben, x[i:j:k] = val.Erweiterte Scheibe in Python?

Wie würde ich das in Python schreiben? Nicht mit der __setslice__, oder? Weil das nur drei Argumente braucht und ich brauche vier.

+0

Welche vier Argumente wollen Sie passieren? – cyroxx

Antwort

5

__setslice__ ist veraltet - Sie sollten __setitem__ mit einem Slice-Argument verwenden.

Beachten Sie, dass je die Python documentation, Scheiben können nur in den folgenden syntaktischen Formen geschehen: a[i:j:step], a[i:j, k:l] oder a[..., i:j]. Die Doppelpunkt-basierte Syntax wird verwendet, um ein einzelnes Slice-Objekt zu definieren, aber wie das zweite Beispiel zeigt, können Sie mehrere Slice-Argumente haben (sie werden als Tupel von Slices übergeben).

Hier ist ein Beispiel, das druckt das key Argument, seine Form zu sehen:

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

Es gibt einen Beispielcode am Ende von http://docs.python.org/release/2.3.5/whatsnew/section-slices.html, der für diese Zwecke tatsächlich noch nützlich ist; Sie dokumentiert (mehr oder weniger) die ansonsten undokumentierte "Index" -Methode von "Slice" -Objekten, ohne die die Implementierung eines ganz allgemeinen "Setitems" auf Slices ziemlich schwierig ist. –

1

__setslice__ ist veraltet, siehe Python 3 changelog:

__getslice__(), __setslice__() und __delslice__() getötet wurden. Die Syntax a[i:j] wird nun in a.__getitem__(slice(i, j)) (oder __setitem__() oder __delitem__() übersetzt, wenn sie als Zuweisungs- oder Löschziel verwendet werden).

In ähnlicher Weise kann man einen Schrittwert zu slice() passieren, was bedeutet, die Syntax a[i:j:k] zu a.__getitem__(slice(i, j, k)) übersetzt.