Cython не может ссылаться на объявленный тип в классе cdef, если есть свойство с тем же именем? - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть некоторый сложный сгенерированный код Cython, который оборачивает библиотеку C ++.

Для одной из библиотек C ++, которую я обертываю, я получаю действительно трудную для понимания ошибку. Ниже приведен минимальный воспроизводимый пример

bad.pxd:

cdef class Foo:
    pass

cdef class Bar:
    pass

bad.pyx:

cdef class Bar:
    x = {}

    Bar.x['Foo'] = Foo

    @property
    def Foo(self):
        pass

    @Foo.setter
    def Foo(self, val):
        pass

Ошибка компилятора Cython:

Error compiling Cython file:
------------------------------------------------------------
...
cdef class Bar:
    x = {}

    Bar.x['Foo'] = Foo
                ^
------------------------------------------------------------

bad.pyx:4:19: 'Foo' is not a constant, variable or function identifier

Это прекрасно компилируется, если я закомментирую Bar.x['Foo'] = Foo или если я закомментирую свойство.

Похоже, вы не можете ссылаться на имя типа, если вы также используете это имя в качестве свойства. Это нормально, если это метод, но не свойство.

Это нарушает какое-то правило в Cython или это скорее ошибка?

Я понимаю, что это правильно ответ "не делай этого", но, к сожалению, я не контролирую имена, которые приводят к этому по общему признанию странному определению класса.

1 Ответ

1 голос
/ 18 февраля 2020

Лучший обходной путь будет

Bar.x['Foo'] = globals()['Foo'].

Даже в некоторых случаях, когда вы упоминаете работу, они не делают то, что вы ожидаете: если Foo - это метод, то диктовка заканчивается как :

{'Foo': <method 'Foo' of 'modulename.Bar' objects>}

(то есть не поведение Python).


Возможно, это ошибка, но я сомневаюсь, что ее легко или с высоким приоритетом исправить, поскольку это комбинация поиска разрешается во время компиляции и свойства не могут быть назначены. Первый почти наверняка известен и, вероятно, не поддается исправлению. Об ошибках может быть сообщено на трекере проблем .

...