我有几个用于调用c代码的python类,使用
c-types
. return结构类似于下面的示例。
import ctypes
class MyCClass(ctypes.Structure):
_fields_ = [('n_values', ctypes.c_int),\
('values', ctypes.c_double * 5)]
def __repr__(self):
return """n_values : {0}, values : {1}""".format(self.n_values,\
self.values)
def __len__(self):
return self.n_values
def __getitem__(self, key):
return self.values[key]
这个
values
array是固定大小的,以简化对c的调用(这里使用可变大小的数组不是一个选项)。数组的“实际”长度由
n_values
变量。
例如,如果
价值观
是一个由三个数字组成的数组,比如
1
,
2
和
3
,
values=[1, 2, 3, 0, 0]
和
n_values=3
.
一切都好。问题是当我实施
__len__
和
__getitem__
.
我想能写出这样的代码
for value in my_class:
#do something
但是迭代器似乎没有“得到”这个
价值观
-数组只是
n_值
长。也就是说,它似乎没有用
MyCClass.__len__
停止迭代。相反,它似乎在
价值观
.
my_class = MyCClass()
my_class.n_values = 3
sample_values = [1, 2, 3]
for i in range(3):
my_class.values[i] = sample_values[i]
i = 0
for value in my_class:
print(i)
i += 1
0
1
2
3
4
我想要
i = 0
for value in my_class:
print(i)
i += 1
0
1
2
我知道我可以编码
for i in range(my_class):
# do something with my_class[i]
但那不是我想要的。
有人知道怎么解决这个问题吗?