1

我正在尝试找到一种方法来编写一个固定长度(目前)的蛮力生成器,我可以像这样最好地激活它。

for i in FixedLength('abc', 3):
    print(i);

i 的值不应该是生成器。这就是我所拥有的:

import sys;
class FixedLength:  
    def __init__(self, charset, length, code_page=sys.getdefaultencoding())
        self.length=length;
        self.code_page=code_page;
        #basically
        self.charset=bytes(charset, code_page);
        self.retval=[charset[0]]*length;

    def __iter__(self):
        return self;

    def __next__(self):
        #problem line 1
        self.recurse(0);
        raise StopIteration;

    def recurse(self, recursion_level):
        if recursion_level==self.length-1:
            for char in self.charset:
                self.retval[recursion_level]=char;
                if self.validate():
                    #problem line 2
                    yield self.output();
        else:
            for char in self.charset:
                self.retval[recursion_level]=char;
                self.recurse(recursion_level+1);
    def validate(self):
        return True;
    def output(self):
        return bytes(self.retval).decode(self.code_page);

我知道它会打印输出(来自问题第 2 行)就好了,但我不能让它产生相同的信息。屈服问题线 1 将生成器封装在生成器中。返回问题行 1 将不起作用,因为它不会引发 StopIteration 错误。但除此之外,它似乎并没有真正递归。虽然,它确实多次调用 self.recurse,但递归级别保持在 0。

4

1 回答 1

0

recurse是一个生成器函数。调用时,它会产生一个序列。如果您__next__想返回序列的下一个值,它必须从以下获取下一个值recurse

def __next__(self):
    next(self.recurse(0))

内置next()也会引发StopIteration异常。

但是,设计有点混乱。它将生成器与您实现类似的尝试混合在一起。换句话说,您将一个生成器包装到另一个生成器中。或者,您正在递归地实现迭代器,这很奇怪。或者我很困惑。目的是什么?它可能可以以更简单的方式实现。

于 2012-05-23T06:42:30.080 回答