2012-03-09 23 views
2

根據關於arithmetic special methods(運算符重載)的Cython文檔,它們的實現方式,我不能依靠self作爲其特殊方法被調用的對象。Cython中的高效算法特殊方法

顯然,這有兩個後果:

  1. 我不能指定在方法聲明靜態類型。例如,如果我有一個類Foo,它只能乘以int,那麼我不能有def __mul__(self, int op)而沒有看到TypeError(有時)。
  2. 爲了決定做什麼,我必須檢查操作數的類型,推測使用isinstance()來處理子類,這在操作符中似乎非常昂貴。

有沒有什麼好的方法來處理這個問題,同時保留操作符語法的便利性?將我的類切換到Cython擴展類型的全部原因是爲了提高效率,但是由於它們嚴重依賴於算術方法,所以基於上述情況,我似乎實際上會讓它們變得更糟。

回答

2

如果我理解正確的文檔和我的測試結果,你實際上可以對一個Foo快速__mul__(self, int op),但你只能把它作爲Foo() * 4,不4 * Foo()。後者將需要__rmul__,這是不支持的,所以它總是提高TypeError

事實上,第二個參數是鍵入int意味着Cython爲你做了類型檢查,所以你可以確定左邊的參數確實是self

+1

你是對的,我正在考慮去那條路線,但它當然不保留操作符語法的**完全**方便。 – ezod 2012-03-09 16:34:28