2015-10-05 24 views
1

我正在編寫一個程序,它具有兩個不同的狀態(一個可轉換單位轉換器,位於英尺和米之間),程序中的多個函數取決於當前狀態(交替itertools的當前值。 cycle()迭代器)。用戶可以調用反轉函數切換當前狀態並反轉計算轉換函數。讀取當前迭代器值而不增加在Python中

目前,我用下一個(currentstate)返回迭代器的這樣的下一個值:

self.currentstate = cycle(range(2))  

def reverse(self): 
    if next(self.currentstate) == 0: 
     self.feet_label.grid(column=2, row=2, sticky=tk.W) 
    if next(self.currentstate) == 1: 
     self.feet_label.grid(column=2, row=1, sticky=tk.W) 

def calculate(self, *args): 
    if next(self.currentstate) == 0: 
     # convert feet to meters 
    if next(self.currentstate) == 1: 
     # convert meters to feet 

不幸的是,每當一個函數被調用,if語句的計算方式,將循環迭代遞增下一個操作員和下一個呼叫會產生不同的結果。計算函數可能會在相同的狀態下多次調用,所以我希望以某種方式檢索迭代器的當前值而不修改或增加運算符。

def calculate(self, *args): 
    if currentvalue(self.currentstate) == 0: 
     # convert feet to meters 
    if currentvalue(self.currentstate) == 1: 
     # convert meters to feet 

我發現一個非常醜陋的解決方法,包括每次if語句調用next(currentvalue)兩次來重置二進制值。這可能是寫這樣兩個狀態程序的非常糟糕的方式,但似乎應該有一種方法來做到這一點。我對Python很陌生,也可能不完全理解迭代器的基本理論。

謝謝

回答

3

它聽起來不像你應該在這裏使用一個迭代器。你應該使用必須明確改變狀態的東西。將它全部包裝在自己的課堂上可能會更好。

class StateMachine(object): 

    STATE_ON = 1 
    STATE_OFF = 0 # this could be an enum maybe? 

    def __init__(self, starting_state=0): 
     self.state = starting_state 

    def self.change_state(self): 
     if self.state = self.STATE_ON: 
      self.state = self.STATE_OFF 
     else: 
      self.state = self.STATE_ON 

現在任何地方你使用你的狀態機,你必須明確地改變狀態。

statemachine = StateMachine() 

def calculate(*args): 
    if statemachine.state == statemachine.STATE_ON: 
     do_something 
    if statemachine.state == statemachine.STATE_OFF: 
     do_something_else 

def switch_state(*args): 
    do_something # and... 
    statemachine.change_state()