I am trying to learn python, the guide I am following is asking me to write a simple 'game', utilizing tuples, lists, and classes.
When running the 'nosetests' command, I get the following error:
E.
====================================================================== ERROR:
tests.LEXICON_tests.test_directions
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Library/Python/2.6/site-packages/nose/case.py",
line 187, in runTest
self.test(*self.arg)
File "/Users/VB/Documents/svn/Programming/python/projects/lexicon/tests/LEXICON_tests.py",
line 6, in test_directions
assert_equal(lexicon.scan("north"),
[('directions', 'north')]) TypeError:
unbound method scan() must be called
with lexicon instance as first
argument (got str instance instead)
---------------------------------------------------------------------- Ran 2 tests in
0.011s
FAILED (errors=1) VB MP > ./lexicon.py
> north [(), ('directions', 'north')] VB MP > ./lexicon.py
> north south east [[[(), ('directions', 'north')],
('directions', 'south')],
('directions', 'east')] VB MP
main file:
#!/usr/bin/env python
# encoding: utf-8
import sys
import os
from LEXICON.game import lexicon
def main():
stuff = raw_input('> ')
lex = lexicon (stuff)
split_array = lex.scan(stuff)
print split_array
#me = lex.tockens(split_array)
#print me
if __name__ == '__main__':
main()
class
#!/usr/bin/env python
# encoding: utf-8
"""
import sys
import os
class lexicon (object):
def __init__(self,data):
self.direction = data
#self.words = data.split()
def scan(self,data):
split_data = data.split()
lex = lexicon (data)
tocken = lex.tockens(split_data)
return tocken
def tockens(self,splitdata):
sentence = splitdata
verbs = ['go','swim','open','punch','fly','stop','kill','eat']
objekts = ['door','bear','face','princess','cabinet']
directions = ['north','south','east','west','down','up','left','right','back']
stopwords = ['the','in','of','from','at','it']
# setep 1, open the array
bit = ()
byte = ()
for x in sentence:
# step 2, match against verbs
for v in verbs:
try:
if (x == v):
bit = ('verb',x)
byte = [byte, bit]
except ValueError:
print "Ooops!"
for o in objekts:
try:
if (x == o):
bit = ('objekt',x)
byte = [byte, bit]
except ValueError:
print "Ooops!"
for d in directions:
try:
if (x == d):
bit = ('directions',x)
byte = [byte, bit]
except ValueError:
print "Ooops!"
for s in stopwords:
try:
if (x == s):
bit = ('stopwords',x)
byte = [byte, bit]
except ValueError:
print "Ooops!"
return byte
test
from nose.tools import *
#import LEXICON
from LEXICON.game import lexicon
def test_directions():
assert_equal(lexicon.scan("north"), [('directions', 'north')])
result = lexicon.scan("north south east")
assert_equal(result, [('directions', 'north'),
('directions', 'south'),
('directions', 'east')])
Thanks!
The way methods are called in python is that the object it is called on is passed as the first argument, and the arguments supplied are each pushed down 1. When you call like its a static method (lexicon.scan) instead of an instance method (lex.scan) this first argument is not supplied.
The method lexicon.scan requires the first argument be a "lexicon" type object, so what you probably want to do in your test is to create a lexicon object (
lex = lexicon(stuff)
) and call scan from that object (lex.scan("north")
). As is, it is callingscan("north")
, while you want the call to bescan(lex, "north")
.