Тесты носа, питон
Я пытаюсь выучить Python, руководство, которому я следую, просит меня написать простую "игру", использующую кортежи, списки и классы.
При запуске команды 'Notest' я получаю следующую ошибку:
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
основной файл:
#!/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
тестовое задание
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')])
Спасибо!
1 ответ
Методы, вызываемые в python, заключаются в том, что объект, к которому он вызывается, передается в качестве первого аргумента, а каждый из предоставленных аргументов сдвигается вниз 1. Когда вы вызываете like его статический метод (lexicon.scan) вместо метода экземпляра (lex.scan) этот первый аргумент не указан.
Метод lexicon.scan требует, чтобы первым аргументом был объект типа "лексикон", поэтому в тесте вы, вероятно, захотите создать объект лексикона (lex = lexicon(stuff)
) и вызвать сканирование с этого объекта (lex.scan("north")
). Как это зовет scan("north")
пока вы хотите, чтобы звонок был scan(lex, "north")
,