2012-08-23 44 views
8

Tôi đang cố gắng để viết một lớp BitArray, và nó sẽ là tiện lợi để có một cái gì đó giống như mảng của numpy, x[i:j:k] = val.Mở rộng lát trong python?

Tôi sẽ viết điều này bằng Python bằng cách nào? Không phải với __setslice__, phải không? Bởi vì điều đó chỉ có ba đối số và tôi cần một để lấy bốn.

+0

gì bốn đối số nào bạn muốn để vượt qua? – cyroxx

Trả lời

5

__setslice__ không được dùng nữa - bạn sẽ muốn sử dụng __setitem__ với đối số lát.

Lưu ý rằng, trên Python documentation, lát chỉ có thể được thực hiện theo các dạng cú pháp sau: a[i:j:step], a[i:j, k:l] hoặc a[..., i:j]. Cú pháp dựa trên dấu hai chấm được sử dụng để định nghĩa một đối tượng slice duy nhất, nhưng như ví dụ thứ hai cho thấy bạn có thể có nhiều đối số slice (chúng được truyền vào dưới dạng một bộ các lát).

Dưới đây là một ví dụ trong đó in luận key, để xem hình thức của nó:

>>> 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ó một số mã mẫu ở cuối http://docs.python.org/release/2.3.5/whatsnew/section-slices.html thực sự vẫn hữu ích cho các mục đích này; nó (nhiều hơn hoặc ít hơn) tài liệu phương pháp 'indices' không có giấy tờ khác không có giấy tờ của các đối tượng' slice', mà không cần thực hiện một 'tập hợp' toàn bộ trên các lát là khá khó khăn. –

1

__setslice__ bị phản đối, xem Python 3 changelog:

__getslice__(), __setslice__()__delslice__() đã bị giết. Cú pháp a[i:j] giờ dịch sang a.__getitem__(slice(i, j)) (hoặc __setitem__() hoặc __delitem__(), khi được sử dụng làm mục tiêu chuyển nhượng hoặc xóa tương ứng).

Tương tự, bạn có thể vượt qua một giá trị bước để slice() có nghĩa là cú pháp a[i:j:k] dịch để a.__getitem__(slice(i, j, k)).

Các vấn đề liên quan