检测Python中的TypeError和属性错误(LPTHW,练习48)

时间:2012-07-12 04:31:23

标签: python nosetests

我正在努力学习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

2 个答案:

答案 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