我是一名新手,通过艰难的方式学习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)])
经过一番调查后,我发现这是一个正在进行同样练习的用户:
那里的答案建议在单元测试中实例化(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?
但我不确定这是否适用。扫描仪可以自我实例化,或者提供的单元测试是一个技巧“问题”,必须修改吗?
答案 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