Cython中无法使用迭代器向deque插入元素的问题排查
Cython调用C++ deque insert迭代器参数报错的解决思路
报错原因
你遇到的Cannot convert 'iterator' to Python object错误,本质是Cython的类型推断问题:当直接在insert调用里传入dq2.begin()和dq2.end()时,Cython默认会尝试把这些C迭代器转换为Python对象,但cdeque[int]的迭代器是纯C底层类型,没有对应的Python对象转换逻辑,因此触发错误。而单个int能正常运行,是因为基础数值类型有内置的Python转换规则。
可行解决方法
显式声明迭代器类型
先导入C++迭代器的Cython类型,再显式定义迭代器变量,避免Cython误判类型:from libcpp.deque cimport deque as cdeque from libcpp.iterator cimport iterator cdef cdeque[int] dq1, dq2 cdef cdeque[int].iterator dq2_begin, dq2_end dq1.push_back(0); dq1.push_back(1) dq2.push_back(2); dq2.push_back(3) dq2_begin = dq2.begin() dq2_end = dq2.end() dq1.insert(dq1.begin(), dq2_begin, dq2_end)使用auto自动推导类型(Cython 0.29+)
利用Cython的auto关键字让编译器自动推导迭代器的C++类型,无需手动声明:from libcpp.deque cimport deque as cdeque cdef cdeque[int] dq1, dq2 dq1.push_back(0); dq1.push_back(1) dq2.push_back(2); dq2.push_back(3) cdef auto dq2_begin = dq2.begin() cdef auto dq2_end = dq2.end() dq1.insert(dq1.begin(), dq2_begin, dq2_end)强制类型转换
在insert调用中直接对迭代器做类型强制转换,明确告诉Cython这是C++迭代器类型:from libcpp.deque cimport deque as cdeque cdef cdeque[int] dq1, dq2 dq1.push_back(0); dq1.push_back(1) dq2.push_back(2); dq2.push_back(3) dq1.insert(dq1.begin(), <cdeque[int].iterator>dq2.begin(), <cdeque[int].iterator>dq2.end())
内容的提问来源于stack exchange,提问作者sos
相关产品推荐
相关产品推荐

