如何将 constexpr 暴露给 Cython?
一个文件 Globals.h
里面定义了一个常量:
namespace MyNameSpace {
/** Constants **/
constexpr index none = std::numeric_limits<index>::max();
}
... 这里的 index
是 uint64_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
作为全局名称使用了。