我为C库编写了一个Python扩展.我有一个如下所示的数据结构:
typedef struct _mystruct{
double * clientdata;
size_t len;
} MyStruct;
Run Code Online (Sandbox Code Playgroud)
此数据类型的目的直接映射到Python中的列表数据类型.因此,我想为导出的结构创建"类似列表"的行为,因此使用我的C扩展编写的代码更像是"Pythonic".
特别是,这是我想要做的(来自python代码)注意:py_ctsruct是在python中访问的ctsruct数据类型.
我的要求可以归结为:
根据PEP234,如果一个对象实现_ iter _()或_ getitem _(),则可以使用"for"进行迭代.然后使用该逻辑,我认为通过将以下属性(通过重命名)添加到我的SWIG接口文件,我将获得所需的行为(除了上面的请求#1 - 我仍然不知道如何实现):
__len__
__getitem__
__setitem__
Run Code Online (Sandbox Code Playgroud)
我现在能够在python中索引C对象.我还没有实现Python异常抛出,但是如果超出数组边界,则返回一个幻数(错误代码).
有趣的是,当我尝试使用'for x in'语法迭代结构时,例如:
for i in py_cstruct:
print i
Run Code Online (Sandbox Code Playgroud)
Python进入一个无限循环,只是在控制台上打印上面提到的魔术(错误)数字.这告诉我索引有问题.
最后但并非最不重要,我如何实施要求1?这涉及(据我所知):
[[更新]]
我有兴趣看一下我需要在我的接口文件中放入什么(如果有的话)声明的一些代码片段,以便我可以从Python迭代c结构的元素.