可爱的 Python:使用状态机
2007-03-29 12:01:01 来源:WEB开发网还请考虑您是否需要使用状态机。许多情况下,最好从更简单的方法入手。也许会发现即使文本文件是有状态的,也有一种简单的方法可以分块读取它(其中每一块是一种类型的输入值)。实际上,在单一状态块中,仅当文本类型之间的转移需要基于内容的计算时,才有必要实现状态机。
下面这个简单的例子说明了需要使用状态机的情况。请考虑用于将一列数字划分成几块的两个规则。在第一个规则中,列表中的零表示块之间的间断。第二个规则中,当一个块中的元素总和超过 100 时,会发生块之间的间断。由于它使用累加器变量来确定是否达到了阈值,您不能“马上”看到子列表的边界。因此,第二个规则也许更适合于类似于状态机的机制。
稍微有些状态、但由 不 太适合用状态机处理的文本文件的例子是 Windows 风格的 .ini 文件。这种文件包括节头、注释和许多赋值。例如:
; set the colorscheme and userlevel
[colorscheme]
background=red
foreground=blue
title=green
[userlevel]
login=2
title=1
我们的例子没有实际含义,但它表明了 .ini 格式一些有趣的特性。
就某种意义而言,每一行的类型由它的第一个字符确定(可能是分号、左花括号或字母)。
从另一种角度看,这种格式是“有状态的”,因为关键字 "title" 大概表示如果它出现在每一节中,那么就有独立的内容。
您可以编写一个有 COLORSCHEME 状态和 USERLEVEL 状态的文本处理器程序,这个程序仍处理每个状态的赋值。但这好象不是处理此问题的 正确 方法。例如,可以使用 Python 代码在这个文本文件中只创建自然块,如:
处理 .INI 文件的分块 Python 代码
import
string
txt = open(
'hypothetical.ini').read()
sects = string.split(txt,
'[')
for
sect
in
sects:
# do something with sect, like get its name
# (the stuff up to ']') and read its assignments
更多精彩
赞助商链接