2012-05-23 29 views
1

我想找到一種方法來寫一個固定的長度(現在)蠻力發電機,我可以優先激活這樣的。蠻力算法不會正確產生;否則工程精細

for i in FixedLength('abc', 3): 
    print(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

您的recurse是生成器函數。當被調用時,它會產生一個序列。如果您__next__想要返回序列的下一個值,它必須從recurse下一個值:

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

內置next()也引起了StopIteration例外。

但是,設計有點困惑。它將發電機與您嘗試實施類似的嘗試混合在一起。換句話說,你正在將一臺發電機包裝到另一臺發電機中。或者,你正在遞歸地實現迭代器,這很奇怪。或者我很困惑。意圖是什麼?它可能可以用更簡單的方式實現。

+0

我試圖嵌套任何數量的for語句,而不是每次都手動輸入它們。這是一個壞主意嗎?除了遞歸之外,我沒有看到任何其他的方式來實現這個(除了'eval',但從來沒有這樣做)。 – user1411571

+0

我不知道這是好還是壞想法,因爲我不知道你試圖解決的確切問題。你能更好地描述它嗎?是否有理由爲此目的定義一個類?生成器在沒有類的情況下也是這樣做的(即替代方案;迭代器類在實現中隱藏)。 – pepr