我可以将参数传递给 Python 中的 __iter__ 函数吗?

lar*_*ang 3 python

我想传递一个参数来控制产生的数据的大小。例如,

class Something:
    def __init__(self):
        self.all_data = list(range(23))

    def __iter__(self, size):
        random.shuffle(self.all_data)
        batch = list()
        for i in self.all_data:
            batch.append(i)
            if len(batch) >= size:
                yield batch
                batch = list()

a = Something()
for i in a:  # TypeError: __iter__() missing 1 required positional argument: 'size'
    print(i)
for i in a(5):  # TypeError: 'Something' object is not callable
    print(i)
Run Code Online (Sandbox Code Playgroud)

Dam*_*ian 8

您可以通过实现__call__方法来获得理想的效果,该方法将收集数据供__iter__使用,我在init构造函数中设置了 self.size以确保属性存在。

这不是你想要的,因为它不是直接传递参数而是通过对象的状态,但它在以下情况下工作 for i in a(5)

请考虑当有人会像这样使用您的代码时for i in a,它会改变逻辑,例如,您可以检查 self.size 是否不是None

import random


class Something:
    def __init__(self):
        self.all_data = list(range(23))
        self.size = 0

    def __iter__(self):
        random.shuffle(self.all_data)
        batch = list()
        for i in self.all_data:
            batch.append(i)
            if len(batch) >= self.size:
                yield batch
                batch = list()

    def __call__(self, n):
        self.size = n
        return self


a = Something()

for i in a(0):
    print(i)
Run Code Online (Sandbox Code Playgroud)

  • 唯一的问题是“for i in a”不会调用“__call__()”方法。 (2认同)