首页 > 解决方案 > Cython 不能声明 None 类型

问题描述

我有一个 .pyx 文件如下:

cdef class Foo:
    def __cinit__(self, bar=None):
        self.bar = bar

和一个 .pxd 如下:

cdef class Foo:
    cdef public ??? bar

而不是???我想将类型声明为int或者None

我尝试使用带有 void 或 int 的 fusedtype,这也不起作用。

有谁知道如何使它编译?使用NoneNull

标签: cython

解决方案


Python 类型的主要目的是定义有效的 C 表示(在使用的空间或速度方面)。intPython 将其理解为 C 整数,并且没有 C 数据类型可以是 C 整数或 PythonNone对象。

然后你有两个选择:

  1. bar创建一个 Python 对象 ( ) 并在cdef public object bar构造函数中添加一些运行时类型检查,以确保它是整数或None. 您可能还想@property在写入时使用 to 来检查它。由于这使用 Python 对象,因此您不应期望任何 Cython 加速。

  2. 制作bar一个int(即一个 C 整数)并选择一些表示无效值的特殊值(因此您需要选择一个您永远不需要表示的值)。这在空间和可能的速度方面将是有效的。


推荐阅读