这几天有点时间,想学点Python基础,今天看到了《learn python the hard way》的 Ex48,这篇文章主要记录一些工具的安装,以及scan 函数的实现。
首先与Ex48相关的章节有前面的Ex46, Ex47,故我们需要先安装一些工具,主要是一些包管理和测试框架的软件:
Install the following Python packages:
pip install distribute/nose/virtualenv
模仿Ex46 的描述,新建工程目录为ex48,进而建立以下目录和文件:
setup.py 如下,一些参数可以设置成自己想要的,如NAME 更改为需要测试的模块名:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
try:
from setuptools import setup except ImportError: from distutils.core import setup config = { 'description': 'My Project', 'author': 'My Name', 'url': 'URL to get it at.', 'download_url': 'Where to download it.', 'author_email': 'My email.', 'version': '0.1', 'install_requires': [ 'nose'], 'packages': [ 'NAME'], 'scripts': [], 'name': 'projectname' } setup(**config) |
在ex48 和 tests 目录下各touch新建一个__init__.py 文件。
测试文件 tests/lexicon_tests.py 摘自网站:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
from nose.tools
import *
from ex48 import lexicon 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')]) def test_verbs(): assert_equal(lexicon.scan( "go"), [( 'verb', 'go')]) result = lexicon.scan( "go kill eat") assert_equal(result, [( 'verb', 'go'), ( 'verb', 'kill'), ( 'verb', 'eat')]) def test_stops(): assert_equal(lexicon.scan( "the"), [( 'stop', 'the')]) result = lexicon.scan( "the in of") assert_equal(result, [( 'stop', 'the'), ( 'stop', 'in'), ( 'stop', 'of')]) def test_nouns(): assert_equal(lexicon.scan( "bear"), [( 'noun', 'bear')]) result = lexicon.scan( "bear princess") assert_equal(result, [( 'noun', 'bear'), ( 'noun', 'princess')]) def test_numbers(): assert_equal(lexicon.scan( "1234"), [( 'number', 1234)]) result = lexicon.scan( "3 91234") assert_equal(result, [( 'number', 3), ( 'number', 91234)]) def test_errors(): assert_equal(lexicon.scan( "ASDFADFASDF"), [( 'error', 'ASDFADFASDF')]) result = lexicon.scan( "bear IAS princess") assert_equal(result, [( 'noun', 'bear'), ( 'error', 'IAS'), ( 'noun', 'princess')]) |
上面程序中 from ex48 import lexicon 表示从ex48 中 导入lexicon 模块,即现在我们要在ex48 目录下写一个lexicon.py 文件,文件主要是scan 函数的实现,根据网站的提示,自己实现如下:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
#!/usr/bin/env python #coding=utf-8 import re def convert_number(s): try: return int(s) except ValueError: return None def scan(input_str): words = input_str. split( ' ') pattern = re. compile(r '\d+') direction_list = [ 'north', 'south', 'west', 'east', 'down', 'up', 'left', 'right', 'back'] verb_list = [ 'go', 'kill', 'stop', 'eat'] stop_list = [ 'the', 'in', 'of', 'from', 'at', 'it'] noun_list = [ 'door', 'bear', 'princess', 'cabinet'] sentence_list = [] for word in words: bool = pattern.match(word) if bool: sentence = ( 'number', convert_number(word)) sentence_list. append(sentence) elif word in direction_list: sentence = ( 'direction', word) sentence_list. append(sentence) elif word in verb_list: sentence = ( 'verb', word) sentence_list. append(sentence) elif word in stop_list: sentence = ( 'stop', word) sentence_list. append(sentence) elif word in noun_list: sentence = ( 'noun', word) sentence_list. append(sentence) else: sentence = ( 'error', word) sentence_list. append(sentence) return sentence_list |
程序中使用正则表达式来匹配数字字符串,请google re 模块之。
执行测试命令,即使用lexicon_tests.py 去测试lexicon.py 里面的函数,输出如下:
simba@ubuntu:~/Documents/code/python/projects/ex48$ nosetests
.........
----------------------------------------------------------------------
Ran 6 tests in 0.007s
OK
参考 :http://learnpythonthehardway.org/book/ex48.html
-------------------------------------------------------------------------------------------------------------------------------------------------
后记:
如果在使用pip or easy_install 时提示url不正确,或者想修改index-url为国内镜像点,可以如下操作:
方法1:命令方式临时修改
easy_install:
1 |
easy_install -i https://pypi.python.org/pypi pstuil |
pip:
1 |
pip -i https://e.pypi.python.org/simple install pstuil |
方法2:配置方式修改
easy_install:
1.打开pydistutils.cfg
1 |
vi ~/.pydistutils.cfg |
2.写入以下内容
1 2 |
[easy_install] index_url = https://pypi.python.org/pypi |
pip:
1.打开pip.conf
1 |
vi ~/.pip/pip.conf |
2.写入以下内容
1 2 |
[global] index-url = https://pypi.python.org/pypi |
下载完成,编译安装过程中如果提示不存在python.h,可以 sudo apt-get install python-dev or yum install python-devel
参考:http://www.lidaren.com/archives/886