设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 8405|回复: 6
打印 上一主题 下一主题

【提问】Python执行nosetests测试时,出现AssertionError和TypeError

[复制链接]

2

主题

0

好友

24

积分

新手上路

Rank: 1

跳转到指定楼层
楼主
发表于 2017-8-28 23:59:16 |只看该作者 |倒序浏览
  1. class ParserError(Exception):
  2.     pass

  3. class Sentence(object):

  4.     def __init__(self, subject, verb, object):
  5. self.subject = subject [1]
  6.         self.verb = verb[1]
  7.         self.object = object[1]

  8. def peek(word_list):
  9.     if word_list:
  10.         word = word_list[0]
  11.         return word[0]
  12.     else:
  13.         return None

  14. def match(word_list, expecting):
  15. if word_list:
  16.         word = word_list.pop(0)

  17.         if word[0] == expecting:
  18.             return word
  19.         else:
  20.             return None
  21.     else:
  22.         return None

  23. def skip (word_list, word_type):
  24.     while peek(word_list) == word_type:
  25.         match(word_list, word_type)

  26. def parse_verb(word_list):
  27.     skip(word_list, 'stop')

  28.     if peek(word_list) == 'verb':
  29.         return match(word_list, 'verb')
  30.     else:
  31.         raise ParserError("Expected a verb next.")


  32. def parse_object(word_list):
  33.     skip(word_list,'stop')
  34.     next = peek(word_list)

  35.     if next == 'noun':
  36.         return match(word_list, 'noun')
  37.     if next == 'direction':
  38.         return match(word_list, 'direction')
  39.     else:
  40.         raise ParserError('Expected a noun or direction next.')

  41. def parse_subject(word_list, subj):
  42.     verb = parse_verb(word_list)
  43.     obj = parse_object(word_list)

  44.     return Sentence(subj, verb, obj) # 执行 class Sentence

  45. def parse_sentence(word_list):
  46.     skip(word_list, 'stop')

  47.     start = peek(word_list)

  48.     if start == 'noun':
  49.         subj = match(word_list, 'noun')
  50.         return parse_sentence(word_list, subj)
  51.     elif start == 'verb':
  52.         # assume the subject is the player then
  53.         return parse_subject(word_list, ('noun', 'player'))
  54.     else:
  55.         raise ParserError("Must start with subject, object, or verb not: %s" % start)
复制代码
以上是需要测试的代码。
这是我写的测试代码,其中两部分错误较相似:
  1. word_listA = [('verb','elsker'),('direction','ikke'),('noun','Jag')]
  2. def test_sentence():
  3.     sentence = Sentence([('noun','Jag'), ('verb', 'elsker'), ('direction', 'ikke')])
  4.     assert_equal(sentence.subject, 'Jag')
复制代码
  1. def test_parse_sentence():
  2.     result = parse_sentence([('verb','elsker'),('noun','Jag')])
  3.     assert_equal(result.subject, 'player')
  4.     assert_equal(result.verb, 'elsker')
  5.     assert_equal(result.object, 'Jag')

  6.     result1 = parse_sentence([('noun','Jag'), ('verb','elsker'),('direction','ikke')])
  7.     assert_equal(result1.subject, 'Jag')
  8.     assert_equal(result1.verb, 'elsker')
  9.     assert_equal(result1.object, 'ikke')

  10.     assert_raises(ParserError, parse_object,[('stop','in'),('stop','the')])
复制代码
执行nosetests后,报错:

Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/nose-1.3.7-py2.7.egg/nose/case.py", line 197, in runTest
    self.test(*self.arg)
  File "/Users/admin/mystuff/test/ex49_tests.py", line 6, in test_sentence
    sentence = Sentence([('noun','Jag'), ('verb', 'elsker'), ('direction', 'ikke')])
TypeError: __init__() takes exactly 4 arguments (2 given)
======================================================================

Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/nose-1.3.7-py2.7.egg/nose/case.py", line 197, in runTest
    self.test(*self.arg)
  File "/Users/admin/mystuff/test/ex49_tests.py", line 68, in test_parse_sentence
    result1 = parse_sentence([('noun','Jag'), ('verb','elsker'),('direction','ikke')])
  File "/Users/admin/mystuff/test/ex49.py", line 70, in parse_sentence
TypeError: parse_sentence() takes exactly 1 argument (2 given)

这是另一部分及其AssertionError报错:
  1. def test_skip():
  2.     skipA = skip([('noun','Jag'), ('verb', 'elsker')], 'verb')
  3.     assert_equal(skipA, ('verb', 'elsker'))
  4.     assert_equal(skipA, None)
复制代码
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/nose-1.3.7-py2.7.egg/nose/case.py", line 197, in runTest
    self.test(*self.arg)
  File "/Users/admin/mystuff/test/ex49_tests.py", line 27, in test_skip
    assert_equal(skipA, ('verb', 'elsker'))
AssertionError: None != ('verb', 'elsker')

回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

沙发
发表于 2017-8-29 14:14:02 |只看该作者
报错的内容不是都输出了吗,到标准的行那里去检查

一个是你 __init__ 参数,也就是创建对象时候给的参数不对
一个是 skipA 的值是 None
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

2

主题

0

好友

24

积分

新手上路

Rank: 1

板凳
发表于 2017-8-29 18:42:43 |只看该作者
crossin先生 发表于 2017-8-29 14:14
报错的内容不是都输出了吗,到标准的行那里去检查

一个是你 __init__ 参数,也就是创建对象时候给的参数不 ...

有点不明白她书中给出的expecting具体是指的什么
  1. def match(word_list, expecting):
  2.     # 用pop( )的方法删除这个元素,并且它还返回这个元素
  3.     if word_list:
  4.         word = word_list.pop(0)

  5.         if word[0] == expecting:
  6.             return word
  7.         else:
  8.             return None
  9.     else:
  10.         return None
复制代码
我给进去的list[('verb', 'taste'),('direction','good'),('noun','pizza')]第一个就是verb并且等于word_type :'verb'
按理说应该是匹配的,然而skipA的值是None也就是说('verb', 'taste') != expecting 咯?
  1. Traceback (most recent call last):
  2.   File "/Library/Python/2.7/site-packages/nose-1.3.7-py2.7.egg/nose/case.py", line 197, in runTest
  3.     self.test(*self.arg)
  4.   File "/Users/admin/mystuff/test/ex49_tests.py", line 60, in test_parse_subject
  5.     result = parse_subject([('verb', 'taste'), ('direction', 'good'),('noun','pizza')])
  6. TypeError: parse_subject() takes exactly 2 arguments (1 given)

  7. ======================================================================
  8. ERROR: ex49_tests.test_parse_sentence
  9. ----------------------------------------------------------------------
  10. Traceback (most recent call last):
  11.   File "/Library/Python/2.7/site-packages/nose-1.3.7-py2.7.egg/nose/case.py", line 197, in runTest
  12.     self.test(*self.arg)
  13.   File "/Users/admin/mystuff/test/ex49_tests.py", line 77, in test_parse_sentence
  14.     result1 = parse_sentence([('noun','pizza'),('verb','taste'),('direction','good')])
  15.   File "/Users/admin/mystuff/test/ex49.py", line 74, in parse_sentence
  16.     return parse_sentence(word_list, subj)
  17. TypeError: parse_sentence() takes exactly 1 argument (2 given)
复制代码
还有一个没有搞明白的错误是:
  1. Traceback (most recent call last):
  2.   File "/Library/Python/2.7/site-packages/nose-1.3.7-py2.7.egg/nose/case.py", line 197, in runTest
  3.     self.test(*self.arg)
  4.   File "/Users/admin/mystuff/test/ex49_tests.py", line 65, in test_parse_subject
  5.     result1 = parse_subject([('direction', 'good') ,('noun','pizza'),('verb', 'taste')],('verb', 'taste'))
  6.   File "/Users/admin/mystuff/test/ex49.py", line 62, in parse_subject
  7.     verb = parse_verb(word_list)
  8.   File "/Users/admin/mystuff/test/ex49.py", line 46, in parse_verb
  9.     raise ParserError("Expected a verb next.")
  10. ParserError: Expected a verb next.
复制代码
在parse_subject中:
  1. def parse_subject(word_list, subj):
  2.     verb = parse_verb(word_list)
  3.     obj = parse_object(word_list)

  4.     return Sentence(subj, verb, obj)
复制代码
verb里面要求传入的list第一个是verb, 而obj中要求第一个传入的是noun或者direction
所以在测试代码中:
  1. def test_parse_subject():
  2.     result = parse_subject([('verb', 'taste'), ('direction', 'good'),('noun','pizza')],('noun','pizza'))
  3.     assert_equal(result.subject, 'pizza')
  4.     assert_equal(result.verb, 'taste')
  5.     assert_equal(result.object, 'good')

  6.     result1 = parse_subject([ ('direction', 'good'),('noun','pizza'),('verb', 'taste')],('none', 'pizza'))
  7.     assert_equal(result.subject, 'pizza')
  8.     assert_equal(result.verb, 'taste')
  9.     assert_equal(result.object, 'good')
复制代码
result中第一个传入的是verb,为了测试    verb = parse_verb(word_list) 所以没有报错
result1中第一个传入的direction 为了测试  obj = parse_object(word_list) 但是报错了
  1. Traceback (most recent call last):
  2.   File "/Library/Python/2.7/site-packages/nose-1.3.7-py2.7.egg/nose/case.py", line 197, in runTest
  3.     self.test(*self.arg)
  4.   File "/Users/admin/mystuff/test/ex49_tests.py", line 65, in test_parse_subject
  5.     result1 = parse_subject([('direction', 'good'),('verb', 'taste'),('noun','pizza')],('noun','pizza'))
  6.   File "/Users/admin/mystuff/test/ex49.py", line 62, in parse_subject
  7.     verb = parse_verb(word_list)
  8.   File "/Users/admin/mystuff/test/ex49.py", line 46, in parse_verb
  9.     raise ParserError("Expected a verb next.")
  10. ParserError: Expected a verb next.
复制代码
如果我将传入的list中第一个改为verb,即[('verb', 'taste'), ('direction', 'good'),('noun','pizza')],('noun','pizza')
它就不会报错了,请问这是为什么呢?(即使obj中同样要求第一个传入的是noun或者direction)

然后关于最后一个报错:
  1. Traceback (most recent call last):
  2.   File "/Library/Python/2.7/site-packages/nose-1.3.7-py2.7.egg/nose/case.py", line 197, in runTest
  3.     self.test(*self.arg)
  4.   File "/Users/admin/mystuff/test/ex49_tests.py", line 77, in test_parse_sentence
  5.     result1 = parse_sentence([('noun','pizza'),('verb','taste'),('direction','good')])
  6.   File "/Users/admin/mystuff/test/ex49.py", line 74, in parse_sentence
  7.     return parse_sentence(word_list, subj)
  8. TypeError: parse_sentence() takes exactly 1 argument (2 given)
复制代码
parse_sentence() 中只能传入一个参数,而我的测试代码中    result1 = parse_sentence([('noun','pizza'),('verb','taste'),('direction','good')])只有一个list,并且第一个为('noun','pizza'),符合
  1.     if start == 'noun':
  2.         subj = match(word_list, 'noun')
  3.         return parse_sentence(word_list, subj)
复制代码
但是它还是显示的2 given

对于  result = parse_sentence([('verb','taste'),('noun','pizza'),('direction','good')]),我传入的也是的一个list,只是开头第一个是verb符合
  1.    
  2.     elif start == 'verb':
  3.         # assume the subject is the player then
  4.         return parse_subject(word_list, ('noun', 'player'))
复制代码
如果删除result1,只对result1进行测试就没有报错了。请问result1中的TypeError: parse_sentence() takes exactly 1 argument (2 given)究竟是哪里出错了呢?
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

地板
发表于 2017-8-29 23:19:32 |只看该作者
请先看看教程里关于函数的参数传递。你对函数传递理解有问题,以你最后一个为例:
  1. return parse_subject(word_list, ('noun', 'player'))
复制代码
这个parse_subject 传了两个参数进去,报错说你 parse_sentence() takes exactly 1 argument (2 given) 这应该很明白吧

要不然就是你没看明白报错在说什么,仔细对照下报错给你的行数。

先把这个问题导致的错误都解决掉,剩下的还有想不通的我们再看。别一贴就是一整屏的代码,这个给人压力有点大,别人也没信心帮你看了
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

2

主题

0

好友

24

积分

新手上路

Rank: 1

5#
发表于 2017-8-30 00:19:12 |只看该作者
crossin先生 发表于 2017-8-29 23:19
请先看看教程里关于函数的参数传递。你对函数传递理解有问题,以你最后一个为例:这个parse_subject 传了两 ...

嗯,好的。谢谢啦,TypeError这个问题已经解决了
但是就是不明白给进去的是list[('verb', 'taste'),('direction','good'),('noun','pizza')]第一个的word_type就是‘verb’并且与其word_type - 'verb'相同
按理说应该是匹配的,然而skipA的值是None
这个地方我没有想明白

回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

6#
发表于 2017-8-30 09:43:13 |只看该作者
Electro01 发表于 2017-8-30 00:19
嗯,好的。谢谢啦,TypeError这个问题已经解决了
但是就是不明白给进去的是list[('verb', 'taste'),('dir ...

skip 这个函数你本身就没有给任何返回值啊
还是函数相关的概念

另外多输出,一步步查看结果
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

2

主题

0

好友

24

积分

新手上路

Rank: 1

7#
发表于 2017-8-30 12:40:00 |只看该作者
crossin先生 发表于 2017-8-30 09:43
skip 这个函数你本身就没有给任何返回值啊
还是函数相关的概念

好哒 明白了 谢谢~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-4-27 07:01 , Processed in 0.029926 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部