2015-04-07 7 views
-1

Проблема Проблема, которую я пытаюсь решить is-- У меня есть приложение python, которое принимает вход пользователя различными способами и создает события на основе этих входов. Я хочу, чтобы мы использовали конечный конечный автомат для обработки переходов состояний и в настоящее время имеем график конечного автомата, представленный в самом коде python.Представление конечного состояния машины в Python Application Logic

Вот то, что я пытался до сих пор, реализуя эквивалент большого заявления переключателя в питоне, например:

if input == 0 and prev_state == 1: 
    cur_state = 3 
elif input == 1 and prev_state == 2: 
    cur_state = 4 

Это неуклюжее и подвержены ошибкам, поэтому я хотел бы, чтобы переместить это определение графика этого вне кода python и в отдельный файл, который использует что-то вроде BNF или аналогично, чтобы упростить управление графом конечной машины.

ФШМ файл график может выглядеть следующим образом:

current_state == 1 and input == 2 -> next_state = 0 

код питон может выглядеть примерно так (псевдопользователей):

fms = MyFsm("my_graph.txt") 
while(True): 
    input = console.get_input() 
    current_state = fsm.transition(previous_state, input) 

Мой вопрос: как я могу представить конечный конечный автомат в python без использования команд if/elif?

+2

Может ли кто-нибудь объяснить объяснения? Хотелось бы узнать здесь, и downvotes не дают мне многого, чтобы пойти ... –

+1

* «любые существующие библиотеки python ... есть ли какие-либо существующие простые методы нотации, вы бы порекомендовали» * - запросы для нас, чтобы найти или рекомендовать инструменты любых видов вне темы здесь, на SO. – jonrsharpe

+1

Вопросы, предлагающие нам рекомендовать или находить книгу, инструмент, библиотеку программного обеспечения, учебное пособие или другие ресурсы за пределами сайта, не относятся к теме для переполнения стека, поскольку они, как правило, привлекают упрямые ответы и спам. Вместо этого опишите проблему и то, что было сделано до сих пор, чтобы ее решить. – Selcuk

ответ

2

Да, ваше чувство кишки правильное, что подход if/else/switch к управлению состоянием подвержен ошибкам. Хотя это может быть хорошо для небольших FSM, они могут быстро стать громоздкими.

Если вы вводите одно значение, то одним простым подходом для управления этим в Python было бы использовать словарь для отображения текущего состояния и ввода в состояние перехода. Например,

map = [ 
    { 'input': 0, 'current_state': 0, 'transition_state': 1 }, 
    { 'input': 0, 'current_state': 1, 'transition_state': 0 }, 
] 

Тогда ваш код состояния перехода будет просто искать нужное состояние перехода на основе значений input и current_state. Например,

def lookup(input, state): 
    transition_state = None 
    for item in map: 
     if item.current_state == state and item.input == input: 
      transition_state = item.transition_state 

    return transition_state 

Это лучше, чем if/elif подход, так как вы отделяя FSM переходы от самого питона кода, который затем делает возможным и намного проще, чтобы загрузить набор данных FSM из внешнего файла , база данных и т. д.

+1

Это именно та помощь, которую я искал. Спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^