在 Python 应用程序逻辑中表示有限状态机
Representing a Finite State Machine in Python Application Logic
我试图解决的问题是——我有一个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 代码可能如下所示(伪):
fms = MyFsm("my_graph.txt")
while(True):
input = console.get_input()
current_state = fsm.transition(previous_state, input)
我的问题是:如何在不使用一堆 if / elif 语句的情况下在 python 中表示有限状态机?
是的,您的直觉是正确的,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 转换与 python 代码本身分开,这使得加载成为可能并且更容易来自外部文件、数据库等的 FSM 数据集
我试图解决的问题是——我有一个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 代码可能如下所示(伪):
fms = MyFsm("my_graph.txt")
while(True):
input = console.get_input()
current_state = fsm.transition(previous_state, input)
我的问题是:如何在不使用一堆 if / elif 语句的情况下在 python 中表示有限状态机?
是的,您的直觉是正确的,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 转换与 python 代码本身分开,这使得加载成为可能并且更容易来自外部文件、数据库等的 FSM 数据集