我有几个Python类用于调用C代码,使用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
数组的大小是固定的,以简化对C的调用(这里不允许使用可变大小的数组)。数组的“实际”长度由n_values
变量控制。你知道吗
例如,如果values
是一个由三个数字组成的数组,例如1
、2
和3
、values=[1, 2, 3, 0, 0]
和n_values=3
。你知道吗
这一切都很好。问题是当我实现__len__
和__getitem__
时。你知道吗
我想能够写这样的代码
for value in my_class:
#do something
但是迭代器似乎没有“得到”values
-数组只有n_values
长。也就是说,它似乎没有使用MyCClass.__len__
来停止迭代。相反,它似乎在values
的整个长度上迭代。你知道吗
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]
但那不是我想要的。你知道吗
有人知道怎么修吗?你知道吗
对于旧式迭代器类型,唯一的方法是提出
IndexError
:为了更简洁的解决方案,请考虑使用更现代的迭代协议,即从iterable上定义的
__iter__
方法返回迭代器实例。这是有记载的here。你知道吗相关问题 更多 >
编程相关推荐