2015-10-05 22 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()