alkopop79
alkopop79

Reputation: 539

python syntax mess: name is not defined

I've been learning from 'Learn Python the Hard Way' and this particular piece of code gives me a lot of headache:

def break_words(stuff):
    """This function will break up words for us."""
    words = stuff.split(' ')
    return words

def sort_words(words):
    """Sort the words."""
    return sorted(words)

def print_first_word(words):
    """Prints the first word after popping it off."""
    word = words.pop(0)
    print word

def print_last_word(words):
    """Prints the last word after popping it off."""
    word = words.pop(-1)
    print word

def sort_sentence(sentence):
    """Takes in a full sentence and returns the sorted words."""
    words = brea_words(sentence)
    return sort_words(words)

def print_first_and_last(sentence):
    """Prints the first and last words of the sentence."""
    words = break_words(sentence)
    print_first_word(words)
    print_last_word(words)

def print_first_and_last_sorted(sentence):
    """Sorts the words then prints the first and last one."""
    words = sort_sentence(sentence)
    print_first_word(words)
    print_last_word(words) 

Once the module is imported I get errors:

>>> import ex25
>>> sentence = "All good things come to those who wait."
>>> words = ex25.break_words(sentence)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "ex25.py", line 4, in break_words
    return words
NameError: global name 'words' is not defined

Where did I go wrong? I checked the code millions of times...

Upvotes: 1

Views: 2994

Answers (3)

ddzialak
ddzialak

Reputation: 1080

Suppose above answer is enough - you need to reload module. On the NFS filesystem I saw troubles with not recompiled python code after it was changed (and old pyc file was used). If 'reload' does not work you can try remove pyc file and restart python.

  ddzialak@pld ~$ python
  Python 2.7.2 (default, Aug 16 2011, 10:09:58)
  [GCC 4.6.1 20110714 (release)] on linux2
  Type "help", "copyright", "credits" or "license" for more information.
  >>> import ex25
  >>> sentence = "All good things come to those who wait."
  >>> words = ex25.break_words(sentence)
  >>> print words
  ['All', 'good', 'things', 'come', 'to', 'those', 'who', 'wait.']

Upvotes: 0

Aaron Sokoloski
Aaron Sokoloski

Reputation: 71

Have you tried running

reload(ex25)

? If you import a file, then change that file, the python process doesn't know that you changed it. You have to either restart, or tell it to look at the module again.

Upvotes: 5

Jakob Bowyer
Jakob Bowyer

Reputation: 34718

As I say in my comment I think your pyc file is being imported rather than your py code.

Upvotes: 1

Related Questions