更有效地在Python中调用方法

时间:2011-07-30 21:22:27

标签: python unit-testing methods nosetests

我是一名新手,通过艰难的方式学习Python。

本练习的目的是编写一个单词扫描程序,以便在通过提供的单元测试运行时通过测试。

在以下提供的单元测试中运行nosetests时出现此错误:

`TypeError:必须使用词典实例作为第一个参数调用未绑定方法scan()(改为使用str实例)

课程提供的测试

from nose.tools import *
from ex48 import lexicon

def test_directions():
    assert_equal(lex.scan("north"), [('direction', 'north')])
    result = lex.scan("north south east")
    assert_equal(result, [('direction', 'north'),
                          ('direction', 'south'),
                          ('direction', 'east)])

经过一番调查后,我发现这是一个正在进行同样练习的用户:

nosetests, python

python variables, classes

那里的答案建议在单元测试中实例化(instaniating?)方法。所以我做了以下修改,并在文件ex48.py中编写了我的类,它通过了nosetests。

修改测试

from nose.tools import *
from ex48 import lexicon


def test_directions():
    lex = lexicon("north")
    assert_equal(lex.scan("north"), [('direction', 'north')])
    lex = lexicon("north south east")
    result = lex.scan("north south east")
    assert_equal(result, [('direction', 'north'),
                          ('direction', 'south'),
                          ('direction', 'east')]) 

ex48.py - 扫描程序

class lexicon(object):

    def __init__(self, data):
        #nosetests fails me if I don't put in some dummy
        # __init__ function with a dummy line, not sure why.
    self.direction = data

    def scan(self, data):
        split_data = data.split()
        directions = ['north', 'south', 'east', 'west']
        data_reply = []
        #for loop for the length of the list
        for split_data_item in split_data:
            #If data is in the directions list
            if split_data_item in directions:
                #Add [('direction', data)] to a dict
                data_reply.append(('direction', split_data_item))

        #Return the list
        return data_reply

我不确定是否要更改单元测试。我在这里找到了“直接对对象进行实例化”的线索:

Python: does calling a method 'directly' instantiate the object?

但我不确定这是否适用。扫描仪可以自我实例化,或者提供的单元测试是一个技巧“问题”,必须修改吗?

2 个答案:

答案 0 :(得分:4)

Learn Python The Hard Way的在线版本中,他们有:

def test_directions():
    assert_equal(lexicon.scan("north"), [('direction', 'north')])
    result = lexicon.scan("north south east")
    assert_equal(result, [('direction', 'north'),
                          ('direction', 'south'),
                          ('direction', 'east')])

用于测试,这表明您不需要词典类,而是需要具有扫描功能的lexicon.py文件进行测试。

它拼写实例化(就像我正在制作这个类的实例一样)。

答案 1 :(得分:2)

您应该按原样保持测试,并在扫描方法上使用@staticmethod装饰器。这样,您就可以直接从类中调用该方法,而无需为此实例化对象。

class lexicon(object):

   @staticmethod
   def scan(data):
      #do the stuff here