python如何使用dunder方法使“foriteration”在“len”处停止

2024-04-20 12:41:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有几个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是一个由三个数字组成的数组,例如123values=[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]

但那不是我想要的。你知道吗

有人知道怎么修吗?你知道吗


Tags: 代码inselfforlenreturnvaluemy
1条回答
网友
1楼 · 发布于 2024-04-20 12:41:25

对于旧式迭代器类型,唯一的方法是提出IndexError

def __getitem__(self, key):
    if key >= len(self):
        raise IndexError
    return self.values[key]

为了更简洁的解决方案,请考虑使用更现代的迭代协议,即从iterable上定义的__iter__方法返回迭代器实例。这是有记载的here。你知道吗

相关问题 更多 >