Класс Cython с аннотациями типа PEP526 не компилируется с непрозрачным AssertionError - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь использовать Cython для ускорения симуляции. Частично это написание некоторых классов расширения. Я попробовал следующие варианты.

# cython: language_level=3
import cython


@cython.cclass
class Location1:
    """A patch of land with resources."""
    cython.declare(resources=cython.double)
    cython.declare(max_resources=cython.double)

    def __init__(self, resources):
        self.max_resources = resources
        self.resources = resources


l1: Location1 = Location1(1)
print(l1.resources)


@cython.cclass
class Location2:
    """A patch of land with resources."""
    resources = cython.declare(cython.double)
    max_resources = cython.declare(cython.double)

    def __init__(self, resources):
        self.max_resources = resources
        self.resources = resources


l2: Location2 = Location2(2)
print(l2.resources)

&

@cython.cclass
class Location3:
    """A patch of land with resources."""
    resources = cython.declare(cython.double, visibility="public")
    max_resources = cython.declare(cython.double, visibility="public")

    def __init__(self, resources):
        self.max_resources = resources
        self.resources = resources


l3: Location3 = Location3(3)
print(l3.resources)

&

@cython.cclass
class Location4:
    """A patch of land with resources."""
    resources: cython.double = 0.0
    max_resources: cython.double = 0.0

    def __init__(self, resources):
        self.max_resources = resources
        self.resources = resources


l4: Location4 = Location4(4)
print(l4.resources)

Варианты 1 и 2, очевидно, терпят неудачу из-за видимости атрибутов. Вариант 3 работает. Но на самом деле, я бы предпочел вариант 4, потому что до добавления Cython мой код был полностью аннотирован типом, и это несколько раз помогало мне находить ошибки, поэтому я хотел бы сохранить его таким. Но этот вариант приводит к

Traceback (most recent call last):
[...]
  File "/usr/lib/python3.8/site-packages/Cython/Compiler/ExprNodes.py", line 2286, in generate_assignment_code
    assert entry.type.is_pyobject, "Python global or builtin not a Python object"
AssertionError: Python global or builtin not a Python object

, что крайне разочаровывает, потому что документы Cython предлагают именно такой синтаксис (я проверял, мой Cython - версия 0.29.16 и, следовательно,> = 0.27). Существует директива компилятора для de ее активации, поэтому я предположил, что она должна работать.

Я что-то не так делаю, или это ошибка в Cython?

...