2012-08-23 20 views
8

Estoy tratando de escribir una clase BitArray, y sería ingenioso tener algo como la matriz de numpy, x[i:j:k] = val.Rebanada extendida en python?

¿Cómo podría escribir esto en Python? No con el __setslice__, ¿verdad? Porque eso solo requiere tres argumentos y necesito uno para tomar cuatro.

+0

¿Qué cuatro argumentos quieres pasar? – cyroxx

Respuesta

5

__setslice__ está en desuso - querrá usar __setitem__ con un argumento de división.

Tenga en cuenta que, por el Python documentation, rebanadas sólo se puede hacer en las siguientes formas sintácticas: a[i:j:step], a[i:j, k:l], o a[..., i:j]. La sintaxis basada en puntos se usa para definir un único objeto de división, pero como muestra el segundo ejemplo, puede tener múltiples argumentos de corte (se pasan como una tupla de sectores).

He aquí un ejemplo que imprime el argumento key, para ver su 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

Hay un código de muestra en la parte inferior de http://docs.python.org/release/2.3.5/whatsnew/section-slices.html que en realidad sigue siendo útil para estos fines; documenta (más o menos) el método 'indices' de los objetos' slice', que no está documentado, sin el cual la implementación de un 'setitem' completamente general en las divisiones es bastante difícil. –

1

__setslice__ es obsoleto, consulte la Python 3 changelog:

__getslice__(), __setslice__() y __delslice__() fueron asesinados. La sintaxis a[i:j] ahora se traduce en a.__getitem__(slice(i, j)) (o __setitem__() o __delitem__(), cuando se utiliza como destino de tarea o eliminación, respectivamente).

Del mismo modo, se puede pasar un valor paso a slice() que significa la sintaxis a[i:j:k] se traduce en a.__getitem__(slice(i, j, k)).

Cuestiones relacionadas