可爱的 Python:使用状态机
2007-03-29 12:01:01 来源:WEB开发网StateMachine 类实际上正是抽象状态机所需要的。因为使用 Python 传递函数对象是如此简单,与其它语言中的相似类比较,这个类所需使用行数非常少。
要真正 使用 StateMachine 类,需要为每个要使用的状态创建一些处理程序。处理程序必须符合模式。它循环处理事件,直到要转移到另一个状态,此时处理程序应该将一个字节组(它包括新状态名称以及新的状态处理程序需要的任何 cargo)传递回去。
在 StateMachine 类中将 cargo 用作变量的做法将封装状态处理程序所需的数据(该状态处理程序不必调用它的 cargo 变量)。状态处理程序使用 cargo 来传递下一个处理程序所需的内容,于是新的处理程序可以接管前一个处理程序的遗留工作。 cargo 通常包括文件句柄,它允许下一个处理程序可以在前一个处理程序停止后读取更多数据。 cargo 还可能是数据库连接、复杂的类实例或带有几个项的列表。
现在,让我们研究测试样本。在本例中(在以下代码示例中概述),cargo 只是不断将反馈传送给迭代函数的一个数字。只要 val 处于某个范围内,则 val 的下一个值永远只是 math_func(val) 。一旦函数返回了超出范围的值,那么该值将传送到另一个处理程序,或者状态机在调用了一个什么也不做的终态处理程序后就退出。示例说明了一件事: 事件不必是输入事件。它也可以是计算事件(这种情况很少)。状态处理程序相互之间的区别只是在输出它们处理的事件时使用不同的标记。该函数比较简单,没必要使用状态机。但它很好地说明了概念。代码也许比解释更易于理解!
文件:statemachine_test.py
from
statemachine
import
StateMachine
def
ones_counter
(val):
print
"ONES State: ",
while
1:
if
val <= 0
or
val >= 30:
newState =
"Out_of_Range" ;
break
elif
20 <= val < 30:
newState =
"TWENTIES";
break
elif
10 <= val < 20:
newState =
"TENS";
break
else
:
print
" @ %2.1f+" % val,
val = math_func(val)
print
" >>"
return
(newState, val)
def
tens_counter
(val):
print
"TENS State: ",
while
1:
if
val <= 0
or
val >= 30:
newState =
"Out_of_Range";
break
elif
1 <= val < 10:
newState =
"ONES";
break
elif
20 <= val < 30:
newState =
"TWENTIES";
break
else
:
print
" #%2.1f+" % val,
val = math_func(val)
print
" >>"
return
(newState, val)
def
twenties_counter
(val):
print
"TWENTIES State:",
while
1:
if
val <= 0
or
val >= 30:
newState =
"Out_of_Range";
break
elif
1 <= val < 10:
newState =
"ONES";
break
elif
10 <= val < 20:
newState =
"TENS";
break
else
:
print
" *%2.1f+" % val,
val = math_func(val)
print
" >>"
return
(newState, val)
def
math_func
(n):
from
math
import
sin
return
abs(sin(n))*31
if
__name__==
"__main__":
m = StateMachine()
m.add_state(
"ONES", ones_counter)
m.add_state(
"TENS", tens_counter)
m.add_state(
"TWENTIES", twenties_counter)
m.add_state(
"OUT_OF_RANGE", None, end_state=1)
m.set_start(
"ONES")
m.run(1)
更多精彩
赞助商链接