我正在努力学习Python的艰难之路,练习48,使用nosetests来测试元组。我设置的鼻子如下:
def test_directions():
assert_equal(lexicon.scan("north"), [('direction', 'north')])
但是,每次都会出现以下错误:
...line 5, in test_directions
assert_equal(lexicon.scan("north"), [('direction', 'north')])
TypeError: unbound method scan() must be called with lexicon instance
as first argument (got str instance instead)
如果我在“def scan(self):”之上引入@staticmethod,我会收到此错误:
line 24, in scan
words = self.sentence.split()
AttributeError: 'str' object has no attribute 'sentence'
我正在测试它的代码如下。我错过了什么?
class lexicon(object):
def __init__(self, sentence):
self.sentence = sentence
self.direction = "direction"
self.verb = "verb"
self.noun = "noun"
self.stop = "stop"
self.number = "number"
self.direction_words = ('north', 'south', 'east', 'west', 'up', 'down')
self.verb_words = ('go', 'stop', 'kill', 'eat')
self.noun_words = ('door', 'bear', 'princess', 'cabinet')
self.stop_words = ('the', 'in', 'of', 'from', 'at', 'it')
self.a = 0
self.instructions = []
def scan(self):
words = self.sentence.split()
self.a = 0
while self.a < len(words):
result = words[self.a]
if result in self.direction_words:
self.instructions.append(('direction', result))
elif result in self.verb_words:
self.instructions.append(('verb', result))
elif result in self.noun_words:
self.instructions.append(('noun', result))
elif result in self.stop_words:
self.instructions.append(('stop', result))
elif self.test_num(result) == None:
self.instructions.append(('number', "Error"))
else:
self.instructions.append(('number', result))
self.a += 1
return self.instructions
def test_num(self, num):
try:
return int(num)
except ValueError:
return None
答案 0 :(得分:3)
看起来你需要先用字符串实例化你的词典对象,然后在该对象上调用scan。简而言之:
def test_directions():
assert_equal(lexicon("north").scan(), [('direction', 'north')])
您可以看到这一点,因为__init__
方法将sentence
作为参数,而scan
方法没有真正的参数(仅self
,它代表一个实例物体)。使用@staticmethod
只是使它将句子(在本例中为“north”)视为lexicon
类的一个实例,由于显而易见的原因而失败。
答案 1 :(得分:0)
这是问题的完整解决方案
directions = ['north', 'south', 'east']
stops =["the" , "in" , "of"]
verbs = ['go','stop','kill','eat' ]
numbers = xrange(999999999)
nouns=["bear" , "princess" ]
list_of_lists=['go','stop','kill','eat','north', 'south', 'east','door',"the" , "in" , "of","bear" , "princess",xrange(999999999)]
list99=[]
class lexicon:
@staticmethod
def scan(d):
list2=d.split()
list1=[]
list3=[]
try:
for x in d.split():
if int(x) in xrange(999999999):
a = x
list1.append(a)
list2.remove(a)
else:
print "yes"
except:
list99=[]
for x in d.split():
#print x
if x in nouns:
z1 = ("noun" , x)
list3.append(z1)
elif x in directions:
z2 = ("direction" , x)
list3.append(z2)
elif x in verbs:
z2 = ("verb" , x)
list3.append(z2)
elif x in list1:
z2 = ("number" , int(x))
list3.append(z2)
elif x in stops:
z2 = ("stop" , x)
list3.append(z2)
elif x in list2:
z2 = ("error" , x)
list3.append(z2)
else:
print "yes"
print "d:%s"%d.split()
print "list1:%s"%list1
print "list2:%s"%list2
print "list3:%s"%list3
return list3