2015-10-05 1 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 

К сожалению, всякий раз, когда вызывается функция, и если оператор вычисляется итератор цикла увеличивается на следующий оператор и следующий вызов приведут к чему-то другому. Функция вычисления, скорее всего, будет вызвана много раз в одном и том же состоянии, и поэтому я хотел бы каким-то образом восстановить текущее значение итератора без изменения или увеличения оператора.

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

Я нашел действительно уродливые обходные с участием вызова следующего (CurrentValue) дважды в каждом случае заявление для сброса двоичного значения. Это может быть очень ужасным способом написания двух государственных программ, подобных этому, но похоже, что должен быть способ сделать это. Я очень новичок в Python и также не могу полностью понять основную теорию итераторов.

Благодаря

ответ

3

Это не звучит, как вы должны использовать итератор здесь. Вы должны использовать что-то, что должно EXPLICITLY изменить состояние. Возможно, было бы лучше обернуть это все в своем классе.

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() 
Смежные вопросы