2012-07-12 69 views
0

我正在努力学习使用nosetests测试元组的Python 48。我已经设置了nosetest如下:Python中的Nosetests TypeError和属性错误(LPTHW,练习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只是上面的“高清扫描(个体经营)”,我得到这个错误,而不是:

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 

回答

3

它看起来像你需要首先用你的字符串实例化你的词典对象,然后调用该对象的扫描。总之:

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

你可以看到这一点,因为__init__方法采用sentence作为参数,而scan方法并没有真正的参数(只是self,表示对象的实例)。使用@staticmethod只是导致它将该句子(在本例中为“北”)作为lexicon类的实例处理,因为显而易见的原因失败。

+0

完美,谢谢! – 2012-07-13 03:21:43

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