ex48——更复杂的用户输入/扫描输入 lexicon程序defconvert_number(s):处理异常和数字的函数try:returnint(s)exceptValueError:returnNoneclassLexicon():# 因主程序中调用的是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]defscan(self,stuff):# 定义方法scansentence[]wordsstuff.split()forwordinwords:ifwordinself.direction:sentence.append((direction,word))elifwordinself.verb:sentence.append((verb,word))elifwordinself.stop:sentence.append((stop,word))elifwordinself.noun:sentence.append((noun,word))elifconvert_number(word):sentence.append((numb,int(word)))else:sentence.append((error,word))returnsentence# lexicon是否有更好的调用方法lexiconLexicon()fromnose.toolsimport*fromex48importlexicondeftest_direction():# lexicon.scan(str)意味着对函数lexicon添加了属性需要借用类的概念。# 类的其中一个方法是scanassert_equal(lexicon.scan(north),[(direction,north)])resultlexicon.scan(north south east)assert_equal(result,[(direction,north),(direction,south),(direction,east)],)deftest_verbs():assert_equal(lexicon.scan(go),[(verb,go)])resultlexicon.scan(go kill eat)assert_equal(result,[(verb,go),(verb,kill),(verb,eat)])deftest_stops():assert_equal(lexicon.scan(the),[(stop,the)])resultlexicon.scan(the in of)assert_equal(result,[(stop,the),(stop,in),(stop,of)])deftest_nouns():assert_equal(lexicon.scan(bear),[(noun,bear)])resultlexicon.scan(bear princess)assert_equal(result,[(noun,bear),(noun,princess)])deftest_numbers():# 输入的整数第一个单位不能为0assert_equal(lexicon.scan(1234),[(numb,1234)])resultlexicon.scan(12 432)assert_equal(result,[(numb,12),(numb,432)])deftest_errors():# 若输入的单词不在语汇表中则保持原样返回并报错显示其位置assert_equal(lexicon.scan(asdf23),[(error,asdf23)])resultlexicon.scan(bear IAS princess 806)assert_equal(result,[(noun,bear),(error,IAS),(noun,princess),(numb,806)])