Nosetests TypeError и Attribute Error в Python (LPTHW, упражнение 48)

Я работаю над Hard Way, Упражнение 48, используя носовые тесты для проверки кортежей. Ностест, который я настроил, выглядит следующим образом:

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)

Если я ввожу @staticmethod чуть выше «def scan(self):», вместо этого я получаю эту ошибку:

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

person John Rougeux    schedule 12.07.2012    source источник


Ответы (2)


Похоже, вам нужно сначала создать экземпляр объекта лексикона с помощью строки, а затем вызвать сканирование этого объекта. Короче говоря:

def test_directions():
    assert_equal(lexicon("north").scan(), [('direction', 'north')])

Вы можете видеть это, потому что метод __init__ принимает sentence в качестве аргумента, а метод scan не имеет реальных аргументов (только self, который представляет экземпляр объекта). Использование @staticmethod просто заставило его рассматривать предложение (в данном случае «север») как экземпляр класса lexicon, что по очевидным причинам не работает.

person Will    schedule 12.07.2012

Это полное решение проблемы

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
person Bolaji    schedule 05.06.2016