Аргументы метода по умолчанию не работают

Cython, похоже, не понимает, что метод sf::RenderTarget.clear() может вызываться с разными аргументами и позволяет вызывать только последний объявленный вариант в .pxd.

Заголовочный файл SFML (источник):

class RenderTarget {
    void clear(const Color& color = Color(0, 0, 0, 255));
}

Мой Cython .pxd:

cdef extern from 'SFML/Graphics.hpp' namespace 'sf' nogil:
    cppclass CRenderTarget 'sf::RenderTarget':
        void clear()
        void clear(const CColor&)

    cppclass CRenderWindow 'sf::RenderWindow' (CWindow, CRenderTarget):
        ...

Моя оболочка Cython:

cdef class RenderWindow(Window):
    cdef CWindow* c

    def __init__(self, ...):
        self.c = new CRenderWindow()
        ...

    def clear(self, Color color=None):
        if color is None:
            (<CRenderWindow*>self.c).clear()  # The error points here
        else:
            (<CRenderWindow*>self.c).clear(color.c[0])

Ошибка компиляции: Call with wrong number of arguments (expected 1, got 0)

Поэтому я могу вызвать только вариант .clear(color), а не вариант с аргументом по умолчанию .clear(). Что я делаю неправильно?

Моя реализация пытается следовать тому, что объяснено здесь, но я не могу заставить его Работа.


person HankMoody    schedule 09.07.2017    source источник
comment
Почему бы вам не попробовать .clear(None) для первого случая? И, кстати, у цели рендеринга нет определения варианта цвета? И я не понимаю, почему вам нужно создавать две функции, если у вас уже есть аргумент по умолчанию, если цвет не равен нулю.   -  person paws    schedule 09.07.2017
comment
Калибровка .clear(None), к сожалению, не компилируется. И я не делаю две функции, они определены в исходном коде SFML, и я пытаюсь сделать оболочку, чтобы они могли вызывать их из Python.   -  person HankMoody    schedule 09.07.2017
comment
Имеет ли значение порядок, в котором вы перечисляете функции clear (в вашем файле pxd)?   -  person DavidW    schedule 09.07.2017
comment
@DavidW Кажется, что работает только последняя функция, определенная в pxd (видна для Cython).   -  person HankMoody    schedule 09.07.2017
comment
У меня очень похожий код переведен правильно (на Cython 0.25.1). Возможно, стоит проверить вашу версию Cython - если она ниже, то обновите ее, а если выше, то отправьте отчет об ошибке.   -  person DavidW    schedule 09.07.2017
comment
@DavidW Спасибо за предложение, но я уже использую v0.25.2. И я нашел, вероятно, связанную проблему: github.com/cython/cython/issues/1374< /а>   -  person HankMoody    schedule 09.07.2017
comment
Вероятно, вам все равно будет хорошей идеей подать отчет об ошибке - это выглядит регрессией, учитывая, что она работает на более ранней версии, и поэтому, надеюсь, ее можно будет легко исправить...   -  person DavidW    schedule 09.07.2017


Ответы (1)


Я указал псевдонимы (Имена C) для методов в подобных ситуациях. В таком случае

cdef extern from 'SFML/Graphics.hpp' namespace 'sf' nogil:
    cppclass CRenderTarget 'sf::RenderTarget':
        void clear0 "clear" ()
person J.J. Hakala    schedule 09.07.2017
comment
Я думаю, что вы поняли это неправильно - void clear0 "clear"()? Так что они оба относятся к C++ clear, но Cython считает, что у них разные имена. - person DavidW; 09.07.2017
comment
Да, теперь я использую псевдонимы в своем коде, как вы предложили. Я также нашел отчет об ошибке, вероятно, связанный с этим: github.com/cython/cython/issues/ 1374 - person HankMoody; 09.07.2017