В соответствии с документацией Cython относительно arithmetic special methods (перегрузки операторов), как они реализованы, я не могу полагаться на self
, являющийся объектом, вызывающим специальный метод.Эффективные арифметические специальные методы в Cython
Очевидно, что это имеет два последствия:
- Я не могу указать статический тип в объявлении метода. Например, если у меня есть класс
Foo
, который может быть умножен только на, скажем,int
, то я не могу иметьdef __mul__(self, int op)
, не видяTypeError
s (иногда). - Для того, чтобы решить, что делать, мне нужно проверить типы операндов, предположительно используя
isinstance()
для обработки подклассов, что кажется крайне дорогостоящим для оператора.
Есть ли хороший способ справиться с этим, сохраняя при этом удобство синтаксиса оператора? Вся моя причина переключения моих классов на типы расширения Cython - это повышение эффективности, но поскольку они в значительной степени зависят от арифметических методов, основанных на вышеизложенном, кажется, что я действительно сделаю их хуже.
Вы правы, и я рассматриваю возможность прохождения этого маршрута, но, конечно, он не сохраняет ** полное ** удобство синтаксиса оператора. – ezod