проблема принудительной приведения к порядку для левостороннего бинарного оператора - PullRequest
5 голосов
/ 12 августа 2011

Я реализую объект, похожий на массив, который должен взаимодействовать со стандартными массивами numpy.Я просто столкнулся с раздражающей проблемой, которая сводится к следующему:

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

Это приводит к следующему выводу:

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

Понятно, вместо того, чтобы вызывать MyArray().__rmul__( array([1,2,3]) ), как я надеялся,__rmul__ вызывается для каждого отдельного элемента массива, а результат переносится в массив объектов.Мне кажется, что это не соответствует правилам принуждения python .Что еще более важно, это делает мое левое умножение бесполезным.

Кто-нибудь знает способ обойти это?

(Я думал, что это можно исправить с помощью __coerce__, но связанный документ объясняет, что этобольше не вызывается в ответ на бинарные операторы ...)

1 Ответ

1 голос
/ 14 августа 2011

Оказывается, numpy предлагает простое решение этой проблемы. Следующий код работает как задумано.

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

Более подробную информацию можно найти здесь .

...