2013-04-14 62 views
1

我一直在试图通过我的方式工作学习Python的难题和练习48当我运行nosetests时,我继续得到一个错误。我使用的代码,其他人已经验证网站上的工作,但无论怎样我不断收到此错误:学习Python的难题:练习48 - 属性错误

====================================================================== 
ERROR: tests.ex48_tests.test_directions 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/nose/case.py", line 197, in runTest 
     self.test(*self.arg) 
    File "/Users/AlexanderMariona/Documents/Home/Programming/Python/Projects/Exercise 48/tests/ex48_tests.py", line 6, in test_directions 
     assert_equal(lexicon.scan("north"), [('direction', 'north')]) 
AttributeError: 'module' object has no attribute 'scan' 

我得到这个错误6次,每一个我的测试功能。

下面是我用什么我的代码:

lexicon.py:

class Lexicon(object): 

    directions = ['north', 'south', 'east', 'west', 'down', 'up', 'down', 'right'] 
    verbs = ['go', 'stop', 'kill', 'eat'] 
    stops = ['the', 'in', 'at', 'of', 'from', 'at', 'it'] 
    nouns = ['door', 'bear', 'princess', 'cabinet'] 

    def scan(thewords): 

     thewords = thewords.split() 
     sentence = [] 

     for i in thewords: 

      if i in directions: 
       sentence.append(('direction', i)) 

      elif i in verbs: 
       sentence.append(('verb', i)) 

      elif i in stops: 
       sentence.append(('stop', i)) 

      elif i in nouns: 
       sentence.append(('noun', i)) 

      elif i.isdigit(): 
       sentence.append(('number', convert_number(i))) 

      else:    
       sentence.append(('error', i)) 

     return sentence 

    def convert_number(s): 
     try: 
      return int(s) 

     except ValueError: 
      return None 

lexicon = Lexicon() 

(这是写的Dairylee

ex48_tests.py:

from nose.tools import * 
from ex48 import lexicon 


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

def test_verbs(): 
    assert_equal(lexicon.scan("go"), [('verb', 'go')]) 
    result = lexicon.scan("go kill eat") 
    assert_equal(result, [('verb', 'go'), 
          ('verb', 'kill'), 
          ('verb', 'eat')]) 


def test_stops(): 
    assert_equal(lexicon.scan("the"), [('stop', 'the')]) 
    result = lexicon.scan("the in of") 
    assert_equal(result, [('stop', 'the'), 
          ('stop', 'in'), 
          ('stop', 'of')]) 


def test_nouns(): 
    assert_equal(lexicon.scan("bear"), [('noun', 'bear')]) 
    result = lexicon.scan("bear princess") 
    assert_equal(result, [('noun', 'bear'), 
          ('noun', 'princess')]) 

def test_numbers(): 
    assert_equal(lexicon.scan("1234"), [('number', 1234)]) 
    result = lexicon.scan("3 91234") 
    assert_equal(result, [('number', 3), 
          ('number', 91234)]) 


def test_errors(): 
    assert_equal(lexicon.scan("ASDFADFASDF"), [('error', 'ASDFADFASDF')]) 
    result = lexicon.scan("bear IAS princess") 
    assert_equal(result, [('noun', 'bear'), 
          ('error', 'IAS'), 
          ('noun', 'princess')]) 

(这是从LPTHW逐字复制的。)

setup.py:

try: 
    from setuptools import setup 
except ImportError: 
    from distutils.core import setup 

config = { 
    'name': 'Excercise 48', 
    'description': 'LPTHW', 
    'version': '0.1', 
    'author': 'My Name', 
    'author_email': 'My E-Mail', 
    'url': 'None', 
    'download_url': 'None', 
    'packages': ['ex48'], 
    'scripts': [], 
    'install_requires': ['nose'] 
} 

setup(**config) 

,这里是包的目录:

Exercise 48/ 
    bin/ 
    docs/ 
    ex48/ 
     __init__.py 
     lexicon.py 
    setup.py 
    tests/ 
     __init__.py 
     ex48_tests.py 

到底是什么造成这个错误?

+2

发生这种情况是因为模块'词典'中没有'scan'函数。在'Lexicon'类中有一个方法,但是它会失败,因为'self'缺失。 – bereal

+0

啊,我明白了。出于某种原因,我被挂了,因为必须有一个“Lexicon”类,但是在删除之后,它解决了错误。非常感谢你。 – Einfachheit

+0

@bereal,你给了一个很好的答案,但在评论区。为什么不使用Answers区域? –

回答

6

发生此错误是因为模块lexicon中没有功能scan。在类Lexicon中有一个方法,那么它应该像方法一样调用(注意缺少self参数)。

另一方面,Lexicon不必作为类存在,scan可以是一个模块级功能。