在Python应用程序逻辑中表示有限状态机

时间:2015-04-07 13:51:11

标签: python computer-science state-machine

我正在尝试解决的问题是 - 我有一个python应用程序,它以各种方式接受用户输入,并根据这些输入引发事件。我想要一个有限状态机来处理状态转换,并且目前有python代码本身所代表的有限状态机的图形。

通过在python中实现相当于一个大的switch语句,这是到目前为止我尝试过的,如下所示:

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

这很笨拙且容易出错,因此我想将此图形定义移到python代码之外,并将其移动到使用类似BNF之类的单独文件中,以便更轻松地管理有限状态机器图。

fsm图形文件可能如下所示:

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

python代码可能看起来像这样(psuedo):

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

我的问题是:如何在不使用if / elif语句的情况下在python中表示有限状态机?

1 个答案:

答案 0 :(得分:2)

是的,你的直觉是if / else / switch管理状态方法容易出错。虽然对于较小的FSM来说它可以很好,但它们可以很快变得笨拙。

如果您输入的是单个值,那么在Python中管理它的一种简单方法是使用字典将当前状态和输入映射到转换状态。例如,

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

然后,您的状态转换代码只会根据inputcurrent_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转换与python代码本身分开,这样就可以更容易地从外部加载FSM数据集文件,数据库等