“本办法学python” ex49

1.创建目录结构:

首先创建文件ex49,在ex49中创建skeleton,具体文件如下:

2.parser.py文件中的代码:

class ParserError(Exception):
pass

class Sentence(object):
def __init__(self,subject,verb,object):
self.subject=subject[1]
self.verb=verb[1]
self.object=object[1]

def peek(word_list):

if word_list:
word=word_list[0]
return word[0]
else:
return None

def match(word_list,expecting):

if word_list:
word=word_list.pop(0)
if word[0]==expecting:

return word
else:
return None
else:
return None

def skip(word_list,word_type):
result=‘‘
while peek(word_list)==word_type:
result = match(word_list,word_type)
return result

def parse_verb(word_list):
skip(word_list,‘stop‘)

if peek(word_list)==‘verb‘:
return match(word_list,‘verb‘)
else:
raise ParserError("Excepted a verb next")

def parse_object(word_list):
skip(word_list,‘stop‘)
next=peek(word_list)

if next==‘noun‘:
return match(word_list,‘noun‘)
if next==‘direction‘:
return match(word_list,‘direction‘)
else:
raise ParserError("Excepted a noun or direction next.")

def parse_subject(word_list,subj):
verb=parse_verb(word_list)
obj=parse_object(word_list)
a=Sentence(subj,verb,obj)
return a

def parse_sentence(word_list):
skip(word_list,‘stop‘)
start=peek(word_list)
if start==‘noun‘:
subj=match(word_list,‘noun‘)
return parse_subject(word_list,subj)

elif start==‘verb‘:
return parse_subject(word_list,(‘noun‘,‘player‘))
else:
raise ParserError("Must start with subject,object,or verb not :%s %start")

 3.parse_tests.py中为对parser.py进行单元测试代码:

from nose.tools import *
import sys
sys.path.append(‘H:\\ex49\\skeleton‘)
import ex49.parser

word_listA=[(‘verb‘,‘kill‘),(‘direction‘,‘north‘)]
def test_peek():
result=ex49.parser.peek([(‘verb‘,‘kill‘),(‘direction‘,‘north‘)])
assert_equal(result,‘verb‘)

def test_match():
result=ex49.parser.match(word_listA,‘verb‘)
assert_equal(result,(‘verb‘,‘kill‘))
assert_equal(word_listA,[(‘direction‘,‘north‘)])
result1=ex49.parser.match(word_listA,‘stop‘)
assert_equal(result1,None)

def test_skip():
result=ex49.parser.skip([(‘verb‘,‘kill‘),(‘direction‘,‘north‘)],‘verb‘)
assert_equal(result,(‘verb‘,‘kill‘))

def test_parse_verb():
result=ex49.parser.parse_verb([(‘verb‘,‘kill‘),(‘direction‘,‘north‘)])
assert_equal(result,(‘verb‘,‘kill‘))
assert_raises(ex49.parser.ParserError,ex49.parser.parse_verb,[(‘stop‘,‘the‘),(‘direction‘,‘north‘)])

def test_parse_object():
result=ex49.parser.parse_object([(‘stop‘,‘the‘),(‘noun‘,‘door‘)])
assert_equal(result,(‘noun‘,‘door‘))
result1=ex49.parser.parse_object([(‘stop‘,‘the‘),(‘direction‘,‘north‘)])
assert_equal(result1,(‘direction‘,‘north‘))
assert_raises(ex49.parser.ParserError,ex49.parser.parse_object,[(‘stop‘,‘the‘),(‘verb‘,‘go‘)])

def test_parse_subject():
result=ex49.parser.parse_subject([(‘verb‘,‘go‘),(‘stop‘,‘the‘),(‘noun‘,‘door‘)],(‘m‘,‘k‘))
assert_equal(result.subject,‘k‘)
assert_equal(result.verb,‘go‘)
assert_equal(result.object,‘door‘)

def test_parse_sentence():
result=ex49.parser.parse_sentence([(‘verb‘,‘go‘),(‘stop‘,‘the‘),(‘noun‘,‘door‘)])
assert_equal(result.subject,‘player‘)
assert_equal(result.verb,‘go‘)
assert_equal(result.object,‘door‘)

result1=ex49.parser.parse_sentence([(‘stop‘,‘in‘),(‘noun‘,‘door‘),(‘verb‘,‘go‘),(‘direction‘,‘north‘)])
assert_equal(result1.subject,‘door‘)
assert_equal(result1.verb,‘go‘)
assert_equal(result1.object,‘north‘)

assert_raises(ex49.parser.ParserError,ex49.parser.parse_sentence,[(‘stop‘,‘in‘),(‘stop‘,‘the‘)])

 4.遇到的问题:

1)从ex49中导入parse.py时,用from ex49 import parse出错

提示ImportError: No module named ex49

发现是同级目录导入文件方式错误,参考http://blog.chinaunix.net/uid-26000296-id-4372344.html文章中第三点

最后更改为以下导入方式才可行:

import sys
sys.path.append(‘H:\\ex49\\skeleton‘)
import ex49.parser

时间: 2024-10-12 20:32:08

“本办法学python” ex49的相关文章

笨办法学Python 练习13和14

原题: 1 from sys import argv 2 3 script, first, second, third = argv 4 5 print "The script is called:", script 6 print "Your first variable is:", first 7 print "Your second variable is:", second 8 print "Your third variabl

笨办法学 Python (Learn Python The Hard Way)

最近在看:笨办法学 Python (Learn Python The Hard Way) Contents: 译者前言 前言:笨办法更简单 习题 0: 准备工作 习题 1: 第一个程序 习题 2: 注释和井号 习题 3: 数字和数学计算 习题 4: 变量(variable)和命名 习题 5: 更多的变量和打印 习题 6: 字符串(string)和文本 习题 7: 更多打印 习题 8: 打印,打印 习题 9: 打印,打印,打印 习题 10: 那是什么? 习题 11: 提问 习题 12: 提示别人

笨办法学Python(十三)

习题 13: 参数.解包.变量 在这节练习中,我们将讲到另外一种将变量传递给脚本的方法(所谓脚本,就是你写的 .py 程序).你已经知道,如果要运行 ex13.py,只要在命令行运行 python ex13.py 就可以了.这句命令中的 ex13.py 部分就是所谓的"参数(argument)",我们现在要做的就是写一个可以接受参数的脚本. 将下面的程序写下来,后面你将看到详细解释. 1 from sys import argv 2 3 script, first, second, t

笨办法学Python(二十五)

习题 25: 更多更多的练习 我们将做一些关于函数和变量的练习,以确认你真正掌握了这些知识.这节练习对你来说可以说是一本道:写程序,逐行研究,弄懂它. 不过这节练习还是有些不同,你不需要运行它,取而代之,你需要将它导入到 python 里通过自己执行函数的方式运行. 首先以正常的方式 python ex25.py 运行,找出里边的错误,并把它们都改正过来.然后你需要接着下面的答案章节完成这节练习. 你应该看到的结果 这节练习我们将在你之前用来做算术的 python 编译器里,用交互的方式和你的.

笨办法学Python(二十八)

习题 28: 布尔表达式练习 上一节你学到的逻辑组合的正式名称是"布尔逻辑表达式(boolean logic expression)".在编程中,布尔逻辑可以说是无处不在.它们是计算机运算的基础和重要组成部分,掌握它们就跟学音乐掌握音阶一样重要. 在这节练习中,你将在 python 里使用到上节学到的逻辑表达式.先为下面的每一个逻辑问题写出你认为的答案,每一题的答案要么为 True 要么为 False.写完以后,你需要将python 运行起来,把这些逻辑语句输入进去,确认你写的答案是否

笨办法学Python(二十九)

习题 29: 如果(if) 下面是你要写的作业,这段向你介绍了"if语句".把这段输入进去,让它能正确执行.然后我们看看你是否有所收获. 1 people = 20 2 cats = 30 3 dogs = 15 4 5 6 if people < cats: 7 print "Too many cats! The world is doomed!" 8 9 if people > cats: 10 print "Not many cats!

笨办法学Python(二十七)

习题 27: 记住逻辑关系 到此为止你已经学会了读写文件,命令行处理,以及很多 Python 数学运算功能.今天,你将要开始学习逻辑了.你要学习的不是研究院里的高深逻辑理论,只是程序员每天都用到的让程序跑起来的基础逻辑知识. 学习逻辑之前你需要先记住一些东西.这个练习我要求你一个星期完成,不要擅自修改日程,就算你烦得不得了,也要坚持下去.这个练习会让你背下来一系列的逻辑表格,这会让你更容易地完成后面的习题. 需要事先警告你的是:这件事情一开始一点乐趣都没有,你会一开始就觉得它很无聊乏味,但它的目

笨办法学Python(二十六)

习题 26: 恭喜你,现在可以考试了! 你已经差不多完成这本书的前半部分了,不过后半部分才是更有趣的.你将学到逻辑,并通过条件判断实现有用的功能. 在你继续学习之前,你有一道试题要做.这道试题很难,因为它需要你修正别人写的代码.当你成为程序员以后,你将需要经常面对别的程序员的代码,也许还有他们的傲慢态度,他们会经常说自己的代码是完美的. 这样的程序员是自以为是不在乎别人的蠢货.优秀的科学家会对他们自己的工作持怀疑态度,同样,优秀的程序员也会认为自己的代码总有出错的可能,他们会先假设是自己的代码有

笨办法学Python(二十一)

习题 21: 函数可以返回东西 你已经学过使用 = 给变量命名,以及将变量定义为某个数字或者字符串.接下来我们将让你见证更多奇迹.我们要演示给你的是如何使用 = 以及一个新的 Python 词汇return 来将变量设置为"一个函数的值".有一点你需要及其注意,不过我们暂且不讲,先撰写下面的脚本吧: 1 def add(a, b): 2 print "ADDING %d + %d" % (a, b) 3 return a + b 4 5 def subtract(a