Cython, импортирующий операторы C ++: «Оператор перегрузки '+ =' еще не поддерживается». - PullRequest
1 голос
/ 20 июня 2020

Я пытаюсь использовать библиотеку MPFR C ++, потому что я хотел бы иметь простые операторы (например, «+ =» или даже просто «+») для чисел MPFR.

Мой простой пример это следующее

cdef extern from "mpreal.h" namespace "mpfr":
    cdef cppclass mpreal:
        mpreal() except +
        mpreal(const double) except +
        mpreal& operator+=(const mpreal& v) except +

Однако Cython жалуется на

Error compiling Cython file:
------------------------------------------------------------
...

cdef extern from "mpreal.h" namespace "mpfr":
    cdef cppclass mpreal:
        mpreal() except +
        mpreal(const double) except +
        mpreal& operator+=(const mpreal& v) except +
                         ^
------------------------------------------------------------

test_000.pyx:6:26: Overloading operator '+=' not yet supported.

Некоторые операторы упоминаются в https://cython.readthedocs.io/en/latest/src/userguide/wrapping_CPlusPlus.html, чтобы иметь немного другой синтаксис, но "+ = Оператор "нигде не упоминается в inte rnet, он довольно простой и в то же время распространен, поэтому я запутался.

Мой вопрос довольно глупый: я где-то ошибся, или Правильно ли сообщение об ошибке в том смысле, что оператор "+ =" просто еще не поддерживается Cython? Другие операторы, такие как «=» (похоже) работают.

EDIT: User ead указал на что-то в sr c Cython (https://github.com/cython/cython/blob/5a8c984403ce73ac29f9e8b7c78ee5f0f4c608a3/Cython/Compiler/Parsing.py#L2834) который я понимаю как "+ =" просто не поддерживается.

Но глядя на https://github.com/cython/cython/blob/5a8c984403ce73ac29f9e8b7c78ee5f0f4c608a3/Cython/Compiler/Parsing.py#L2909, мне интересно, можно ли это легко расширить, и комментарии к коду действительно предполагают это? Может быть, я смогу разобраться сам и внести свой вклад, но если кто-нибудь знает, что происходит, я был бы рад услышать об этом.

        elif s.sy == '=':
            op += s.sy    # +=, -=, ...
            s.next()
        if op not in supported_overloaded_operators:
            s.error("Overloading operator '%s' not yet supported." % op,
                    fatal=False)

ВАЖНОЕ ИЗМЕНЕНИЕ: Обсуждение продолжается https://github.com/cython/cython/issues/3696, и, как кажется прямо сейчас, предложение ead будет добавлено / исправлено в Cython.

1 Ответ

1 голос
/ 21 июня 2020

Мне кажется, что оператор += просто забыли: += (а также -=, *=, /=) ничем не отличаются от обычного оператора присваивания =.

Когда я изменяю эту строку в Cython-code , которая перечисляет поддерживаемые операторы, на

supported_overloaded_operators = cython.declare(set, set([
    '+', '-', '*', '/', '%',
    '++', '--', '~', '|', '&', '^', '<<', '>>', ',',
    '==', '!=', '>=', '>', '<=', '<',
    '[]', '()', '!', '=',
    'bool', '+=',            #`+=` added!
]))

, я могу успешно создать и использовать следующий минималистичный c репродуктор:

%%cython -+ -c=-std=c++11

cdef extern from *:
    """
    struct A{
    int x=42;
    A& operator+=(const A&o){
        x+=o.x;
      }
    };
    """
    cdef cppclass A:
        int x
        A& operator+=(const A& v)
        
def doit():
    cdef A a;
    a+=a;
    print(a.x)

А теперь:

doit()  # prints 84

выполняет свою работу.

...