(Cython) Сделать аргумент по модулю необязательным в __pow__ - PullRequest
2 голосов
/ 28 июня 2019

Я пытаюсь определить некоторые встроенные арифметические операции для cdef class в файле Cython.

Сначала я попытался сделать функцию __pow__ так:

def __pow__(self, other, modulo=None):
    pass

Но при компиляции получено следующее сообщение об ошибке:

Этот аргумент не может иметь значение по умолчанию

(аргумент, на который ссылается сообщение об ошибке: modulo)

Удаление значения по умолчанию для modulo позволяет файлу правильно скомпилироваться, но вынуждает пользователя предоставить третий аргумент, который не только странный и раздражающий, но и предотвращает использование оператора ** (pow должен быть использован вместо).

Как я могу реализовать __pow__ в Cython, чтобы третий аргумент был необязательным?

1 Ответ

1 голос
/ 28 июня 2019

Вы можете использовать декоратор, чтобы обмануть компилятор Cython, думая, что этот аргумент не имеет значения по умолчанию:

def trickster(func):
    def wrapper(self, other, modulo=None):
        return func(self, other, modulo)
    return wrapper


class MyClass:
   ...
   @trickster
   def __pow__(self, other, modulo):
       ...
...