nosetests, python

浪尽此生 提交于 2019-12-23 03:30:55

问题


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!


回答1:


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 calling scan("north"), while you want the call to be scan(lex, "north").



来源:https://stackoverflow.com/questions/5627528/nosetests-python

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!