如何将C++的optional类型传递至Cython?
处理C++ std::optional到Cython的绑定
要在Cython中正确处理C++的std::optional<std::shared_ptr<CPP_MyObject>>返回值,需要分两步修改.pxd和.pyx文件:
1. 修正Work.pxd文件
首先要在.pxd中声明std::optional模板类型,同时修正函数的返回值签名:
# Work.pxd from libcpp.memory cimport shared_ptr # 绑定std::optional模板类 cdef extern from "<optional>" namespace "std": cppclass optional[T]: bool has_value() noexcept T& value() noexcept # 声明CPP_MyObject(根据实际头文件补充内容) cdef extern from "你的C++头文件路径.h": cppclass CPP_MyObject: pass # 修正函数签名,匹配C++的可选返回类型 optional[shared_ptr[CPP_MyObject]] cpp_find_value()
2. 修正Work.pyx文件
在.pyx中处理std::optional的空值情况,将有值的情况转为Python对象,空值返回None:
# Work.pyx from libcpp.memory cimport shared_ptr from你自己的模块名 cimport CPP_MyObject, Python_MyObject # 替换为实际模块名 def python_find_value(self): cdef optional[shared_ptr[CPP_MyObject]] opt_obj = self.thisptr.get().cpp_find_value() if opt_obj.has_value(): cdef shared_ptr[CPP_MyObject] cpp_object = opt_obj.value() cdef Python_MyObject python_object = Python_MyObject("0") python_object.thisptr = cpp_object return python_object else: # 空可选值对应Python的None return None
核心要点
- 必须先绑定
std::optional模板类,Cython才能识别该类型 - 用
has_value()判断可选值是否存在,避免直接访问value()触发未定义行为 - 空
std::optional返回None,符合Python的API设计习惯
内容的提问来源于stack exchange,提问作者Punreach Rany
相关产品推荐
相关产品推荐

