2011-08-12 27 views
5

Tôi đang triển khai đối tượng giống như mảng có thể tương thích với các mảng tiêu chuẩn. Tôi chỉ cần nhấn một vấn đề gây phiền nhiễu mà thu hẹp xuống như sau:vấn đề ép buộc gumpy đối với nhà điều hành nhị phân bên trái

class MyArray(object): 
    def __rmul__(self, other): 
    return MyArray() # value not important for current purpose 

from numpy import array 
print array([1,2,3]) * MyArray() 

Điều này mang lại kết quả như sau:

[<__main__.MyArray instance at 0x91903ec> 
<__main__.MyArray instance at 0x919038c> 
<__main__.MyArray instance at 0x919042c>] 

Rõ ràng, thay vì gọi MyArray().__rmul__(array([1,2,3])) như tôi đã hy vọng, __rmul__ được kêu gọi mỗi cá nhân phần tử của mảng, và kết quả được bọc trong một mảng đối tượng. Điều này dường như với tôi không phù hợp với python's coercion rules. Quan trọng hơn, nó làm cho phép nhân của tôi vô dụng.

Có ai biết cách này không?

(Tôi nghĩ một thể sửa chữa nó bằng cách sử __coerce__ nhưng tài liệu liên quan giải thích rằng đó là một trong không còn viện dẫn để đáp ứng với các nhà khai thác nhị phân ...)

Trả lời

1

Nó chỉ ra rằng NumPy cung cấp một sửa chữa đơn giản cho vấn đề này . Mã sau hoạt động như dự định.

class MyArray(object): 
    __array_priority__ = 1. # <- fixes the problem 
    def __rmul__(self, other): 
    return MyArray() 

Bạn có thể tìm thêm thông tin here.