我正试图找到一种方法来编写一个固定长度(现在)的强力发生器,我可以这样激活。
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。
答案 0 :(得分:0)
您的recurse
是生成器功能。调用时,它会生成一个序列。如果您的__next__
想要返回序列的下一个值,则必须从recurse
获取下一个值:
def __next__(self):
next(self.recurse(0))
内置next()
也会引发StopIteration
例外。
但是,设计有点混乱。它将生成器与您尝试实现类似的混合。换句话说,您将一台发电机包装到另一台发电机中。或者,您正在递归地实现迭代器,这很奇怪。或者我很困惑。意图是什么?它可能以更简单的方式实现。