在学习 用learn python the hard way的ex48 他只给了一个测试文件,而源文件要求你自己写,你时常会出现这个错误。
unboundlocalerror:local variable ‘xxx’ reference before assignment
我也是初学者,一下只是我的个人见解。
这是因为 他的测试文件中 没有给你的类实例化,assert_equal(lexicon.scan("the"),[('stop','the')]) 在这里你需要实例化你的类,他给的代码需要你来添加实例化的部分。
下面是我做的测试部分
from nose.tools import *
from ex48 import lexicon
def test_directions():
lexicon1=lexicon('1')
assert_equal(lexicon1.scan("north"),[('direction','north')])
lexicon1=lexicon('1')
result = lexicon1.scan("north south east")
assert_equal(result,[('direction','north'),
('direction','south'),
('direction','east')])
def test_verbs():
lexicon1=lexicon('2')
assert_equal(lexicon1.scan("go"),[('verb','go')])
lexicon1=lexicon('2')
result = lexicon1.scan("go kill eat")
assert_equal(result,[('verb','go'),
('verb','kill'),
('verb','eat')])
def test_stops():
lexicon1=lexicon('3')
assert_equal(lexicon1.scan("the"),[('stop','the')])
lexicon1=lexicon('3')
result = lexicon1.scan("the in of")
assert_equal(result,[('stop','the'),
('stop','in'),
('stop','of')])
def test_nouns():
lexicon1=lexicon('4')
assert_equal(lexicon1.scan("bear"),[('noun','bear')])
lexicon1=lexicon('4')
result = lexicon1.scan("bear princess")
assert_equal(result,[('noun','bear'),
('noun','princess')])
def test_numbers():
lexicon1=lexicon('5')
assert_equal(lexicon1.scan("1234"),[('number',1234)])
lexicon1=lexicon('5')
result = lexicon1.scan("bear IAS princess")
assert_equal(result,[('noun','bear'),
('error','IAS'),
('noun','princess')])
下面是我写的类:
class lexicon(object):
def __init__(self,name):
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')
self.result=[]
def comvert_number(self,s):
try:
return int(s)
except:
return None
def scan(self,input):
words=input.split(' ')
for word in words:
if word in self.direction:
self.result.append(('direction',word))
elif word in self.verb:
self.result.append(('verb',word))
elif word in self.stop:
self.result.append(('stop',word))
elif word in self.noun:
self.result.append(('noun',word))
elif (self.comvert_number(word)!=None):
self.result.append(('number',self.comvert_number(word)))
else:
self.result.append(('error',word))
return self.result