我正在尝试学习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')])


谢谢!

最佳答案

在python中,方法的调用方式是将被调用的对象作为第一个参数传递,并且所提供的参数分别向下推1。当您像调用它一样使用静态方法(lexicon.scan)而不是实例方法时(lex.scan)不提供此第一个参数。

方法lexicon.scan要求第一个参数是“词典”类型的对象,因此您可能需要在测试中创建一个词典对象(lex = lexicon(stuff)),然后从该对象(lex.scan("north"))调用scan。照原样,它正在呼叫scan("north"),而您希望呼叫是scan(lex, "north")

关于python - Nose 测试, python ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5627528/

10-12 18:24