тесты носа, питон - PullRequest
       20

тесты носа, питон

1 голос
/ 12 апреля 2011

Я пытаюсь выучить python, руководство, которым я следую, просит меня написать простую «игру», использующую кортежи, списки и классы.

При запуске команды «nosetests» я получаюследующая ошибка:

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 Ответ

2 голосов
/ 12 апреля 2011

Методы, вызываемые в python, заключаются в том, что объект, к которому он вызывается, передается в качестве первого аргумента, а каждый из предоставленных аргументов передается вниз 1. Когда вы вызываете like его статический метод (lexicon.scan) вместо для метода экземпляра (lex.scan) этот первый аргумент не указан.

Метод lexicon.scan требует, чтобы первым аргументом был объект типа «лексикон», поэтому в тесте вы, вероятно, захотите создать объект лексикона (lex = lexicon(stuff)) и вызвать сканирование из этого объекта (* 1004). *). Как есть, он звонит scan("north"), а вы хотите, чтобы звонок был scan(lex, "north").

...