如何将 constexpr 暴露给 Cython?

3 投票
1 回答
559 浏览
提问于 2025-04-18 16:23

一个文件 Globals.h 里面定义了一个常量:

namespace MyNameSpace {

/** Constants **/
constexpr index none = std::numeric_limits<index>::max();

}

... 这里的 indexuint64_t 的一种类型别名。

我该如何把它暴露给 Cython 和 Python 呢?

一个失败的尝试:

cdef extern from "../cpp/Globals.h" namespace "MyNamespace":
    cdef index _none "MyNamespace::none"

none = _none

1 个回答

3

在Cython中,暴露(全局)常量的语法和暴露简单属性的语法很相似。你可以参考这两个链接,分别是暴露简单属性的语法暴露静态成员的语法。在你的例子中,语法几乎是正确的,只是你需要去掉cdef这个声明。cdef是用来在Cython中声明新变量的,不是用来添加关于外部声明变量的信息。

cdef extern from "../cpp/Globals.h" namespace "MyNamespace":
    index _none "MyNamespace::none"

none = _none

然后,如果你的Cython模块叫做mymodule,你可以在Python中使用none,那么导入的语句可以是

from mymodule import none

这样你就可以在你的Python代码中把none作为全局名称使用了。

撰写回答