lexicon程序
def convert_number(s):
"""处理异常和数字的函数"""
try:
return int(s)
except ValueError:
return None
class Lexicon():
# 因主程序中调用的是lexicon.scan(),因此只能是由定义类的属性延伸到函数的属性
"""
功能介绍:
1. 名称:lexicon
2. 实参:用户输入的字符串
3. 返回值return:语汇元组格式
4. 若单词不在单词语汇表中,返回原单词
5. TOKEN错误标记,标记用户错误的地方
"""
def __init__(self):
# 初始化,并设置单词语汇表
self.direction = ['north', 'south', 'east', 'west', 'down', 'up', 'left', 'right', 'back']
self.verb = ['go', 'stop', 'kill', 'eat']
self.stop = ['the', 'in', 'of', 'from', 'at', 'it']
self.noun = ['door', 'bear', 'princess', 'cabinet']
def scan(self, stuff):
# 定义方法scan
sentence = []
words = stuff.split()
for word in words:
if word in self.direction:
sentence.append(('direction', word))
elif word in self.verb:
sentence.append(('verb', word))
elif word in self.stop:
sentence.append(('stop', word))
elif word in self.noun:
sentence.append(('noun', word))
elif convert_number(word):
sentence.append(('numb', int(word)))
else:
sentence.append(('error', word))
return sentence
# lexicon是否有更好的调用方法???
lexicon = Lexicon()
from nose.tools import *
from ex48 import lexicon
def test_direction():
# lexicon.scan(str)意味着对函数lexicon添加了属性,需要借用类的概念。
# 类的其中一个方法是scan
assert_equal(lexicon.scan("north"), [('direction', 'north')])
result = lexicon.scan("north south east")
assert_equal(result, [('direction', 'north'),
('direction', 'south'),
('direction', 'east')],)
def test_verbs():
assert_equal(lexicon.scan("go"), [('verb', 'go')])
result = lexicon.scan("go kill eat")
assert_equal(result, [('verb', 'go'),
('verb', 'kill'),
('verb', 'eat')])
def test_stops():
assert_equal(lexicon.scan("the"), [('stop', 'the')])
result = lexicon.scan("the in of")
assert_equal(result, [('stop', 'the'),
('stop', 'in'),
('stop', 'of')])
def test_nouns():
assert_equal(lexicon.scan("bear"), [('noun', 'bear')])
result = lexicon.scan("bear princess")
assert_equal(result, [('noun', 'bear'),
('noun', 'princess')])
def test_numbers():
# 输入的整数第一个单位不能为0
assert_equal(lexicon.scan("1234"), [('numb', 1234)])
result = lexicon.scan("12 432")
assert_equal(result, [('numb', 12),
('numb', 432)])
def test_errors():
# 若输入的单词不在语汇表中,则保持原样返回,并报错显示其位置
assert_equal(lexicon.scan("asdf23"), [('error', 'asdf23')])
result = lexicon.scan("bear IAS princess 806")
assert_equal(result, [('noun', 'bear'),
('error', 'IAS'),
('noun', 'princess'),
('numb', 806)])