Learn Python the Hard Way: Exercise 48 - AttributeError
<p>I have been attempting to work my way through <em>Learn Python the Hard Way</em>, and on Exercise 48 I continue to get an error when I run <code>nosetests</code>. I am using code that other people have verified on the site to work, but no matter what I continue to get this error:</p>

<pre><code>======================================================================
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'
</code></pre>

<p>I get this error 6 times, one for each of my  test functions.</p>

<p>Here is what I'm using for my code:</p>

<p>lexicon.py:</p>

<pre><code>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()
</code></pre>

<p>(This was written by <a href="http://stackoverflow.com/a/7464350/2272087">Dairylee</a>.)</p>

<p>ex48_tests.py:</p>

<pre><code>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')])
</code></pre>

<p>(This is copied verbatim from <a href="http://learnpythonthehardway.org/book/ex48.html" rel="nofollow">LPTHW</a>.)</p>

<p>setup.py:</p>

<pre><code>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)
</code></pre>

<p>And here is the directory of the package:</p>

<pre><code>Exercise 48/
    bin/
    docs/
    ex48/
        __init__.py
        lexicon.py
    setup.py
    tests/
        __init__.py
        ex48_tests.py
</code></pre>

<p>What exactly is causing this error?</p>
