寻找Python代码
- Python标准库
- Python包索引(PyPi)
善于用右上角的模糊搜索功能 - Github中最流行的Python项目(https://github.com/trending/python)
- 流行Python菜谱有4000多个短Python程序
安装包
推荐使用pip
pip install flask
pip install flask==0.9.0
# 指定最下版本(当你必须使用的一些特性在某个版本之后开始出现时,这个功能特别有用)
# 单引号可以防止shell把>解析成输出重定向
pip install 'flask>=0.9.0'
如果你想安装多个Python包,可以使用requirements文件。虽然它有很多选项,但是最简单的使用方法是列出所有包,一个包一行,加上可选的目标版本或者相对版本:
$ pip -r requirements.txt
# requirements.txt
flask==0.9.0
django
psycopg2
操作系统自带的包管理工具
Linux: apt-get、yum、dpkg和zypper
从源代码安装
有时候,一个Python包是新出的,或者作者还没有把它发布到pip上。如果要安装这样的包,通常需要这样做:
- 下载代码
- 如果是压缩文件,使用zip、tar或者其他合适的工具来解压缩
- 在包含setup.py文件的目录中运行python install setup.py
集成开发环境
IDLE
IDLE是唯一一个标准发行版中包含的Python IDE。它是基于tkinter开发的,图形界面比较简单。
PyCharm
IPython
IPython在后面有介绍,既是一个发布平台也是一个扩展IDE。
命名和文档
文档可以包括注释和文档字符串,也可以把信息记录在变量名、函数名、模块名和类名中。
注意:
- Python没有常量,但是PEP8格式规范建议使用大写字母和下划线来表示常量名。
- 我们基于常量值提前进行了一些计算,应该把它们移动到模块顶层,如果把他们放到函数内部,则每次调用函数都要重新计算。
测试代码
测试Python程序最简单的办法就是添加一些print()语句。Python交互式解释器的读取-求值-打印循环(REPL)允许快速添加和测试修改。
然而,你或许不会想要在产品级代码中添加print()语句,因此需要记住自己添加的所有print()语句并在最后删除它们。但是,这样做很容易出现剪切-粘贴错误。
使用pylint、pyflakes和pep8检查代码
在创建真正的测试程序之前,需要运行Python代码检查器。最流行的是pylint和pyflakes。
$ pip install pylint
$ pip install pyflakes
它们可以检查代码错误和代码风格问题
$ pylint yourfile.py
另一个格式检查工具是pep8
$ pip install pep8
$ pep8 yourfile.py
测试程序逻辑
我们已经通过了代码风格的考验,下面应该真正地测试程序逻辑了。
最好先编写独立的测试程序,在提交代码到源码控制系统之前确保通过所有测试。写测试看起来是一件很麻烦的事,但是它们真的能帮助你更快地发现问题,尤其是回归测试。
使用unittest进行测试
标准库有两个测试包。首先介绍unittest。假设我们编写了一个单词首字母转大写的模块,第一版直接使用标准字符串函数captialize(),之后会看到许多意料之外的结果。
# cap.py
def just_do_it(text):
return text.capitalize()
# test_cap.py
# 测试脚本
import unittest
import cap
class TestCap(unittest.TestCase):
# setUp()和tearDown()通常用来分配和回收测试需要的外部资源,比如数据库连接或者一些测试数据
# setUp()方法会在每个测试方法执行之前执行
def setUp(self):
pass
# tearDown()方法会在每个测试方法执行之后执行
def tearDown(self):
pass
def test_one_word(self):
text = 'duck'
# cap.py为被测试模块
result = cap.just_do_it(text)
# 在unittest中,可以使用assert(断言)开头的方法来检查返回的结果
self.assertEqual(result, 'Duck')
def test_multiple_words(self):
text = 'a veritable flock of ducks'
result = cap.just_do_it(text)
self.assertEqual(result, 'A Veritable Flock Of Ducks')
if __name__ == '__main__':
# 运行所有的测试
unittest.main()
$ python test_cap.py
结果时第一个测试(test_one_word)通过了,但是第二个(test_multiple_words)失败了。(因为capitalize只会把第一个单词的第一个字母转成大写)我们把cap.py中的capitalize()替换成title():
# cap.py
def just_do_it(text):
return text.title()
$ python test_cap.py
两个测试都通过了,看起来没问题了。不过,其实还是有问题的。我们还需要在test_cap.py中添加另个一个方法:
# test_cap.py
# 测试脚本
import unittest
import cap
class TestCap(unittest.TestCase):
# setUp()和tearDown()通常用来分配和回收测试需要的外部资源,比如数据库连接或者一些测试数据
# setUp()方法会在每个测试方法执行之前执行
def setUp(self):
pass
# tearDown()方法会在每个测试方法执行之后执行
def tearDown(self):
pass
def test_one_word(self):
text = 'duck'
# cap.py为被测试模块
result = cap.just_do_it(text)
# 在unittest中,可以使用assert(断言)开头的方法来检查返回的结果
self.assertEqual(result, 'Duck')
def test_multiple_words(self):
text = 'a veritable flock of ducks'
result = cap.just_do_it(text)
self.assertEqual(result, 'A Veritable Flock Of Ducks')
def test_words_with_apostrophes(self):
text = "I'm fresh out of ideas"
result = cap.just_do_it(text)
self.assertEqual(result, "I'm Fresh Out Of Ideas")
if __name__ == '__main__':
# 运行所有的测试
unittest.main()
$ python test_cap.py
结果测试没有通过,title()会把I’m中的m大写。因为title()不能处理撇号。
我们尝试替换另一个函数:capwords()
结果是通过了,但是其实还存在问题,我们向test_cap.py中再加一个测试:
# cap.py
def just_do_it(text):
return text.title()
$ python test_cap.py
两个测试都通过了,看起来没问题了。不过,其实还是有问题的。我们还需要在test_cap.py中添加另个一个方法:
# test_cap.py
# 测试脚本
import unittest
import cap
class TestCap(unittest.TestCase):
# setUp()和tearDown()通常用来分配和回收测试需要的外部资源,比如数据库连接或者一些测试数据
# setUp()方法会在每个测试方法执行之前执行
def setUp(self):
pass
# tearDown()方法会在每个测试方法执行之后执行
def tearDown(self):
pass
def test_one_word(self):
text = 'duck'
# cap.py为被测试模块
result = cap.just_do_it(text)
# 在unittest中,可以使用assert(断言)开头的方法来检查返回的结果
self.assertEqual(result, 'Duck')
def test_multiple_words(self):
text = 'a veritable flock of ducks'
result = cap.just_do_it(text)
self.assertEqual(result, 'A Veritable Flock Of Ducks')
def test_words_with_apostrophes(self):
text = "I'm fresh out of ideas"
result = cap.just_do_it(text)
self.assertEqual(result, "I'm Fresh Out Of Ideas")
def test_words_with_quotes(self):
text = "\"You're despicable,\" said Daffy Duck"
result = cap.just_do_it(text)
self.assertEqual(result, "\"You're Despicable,\" Said Daffy Duck")
if __name__ == '__main__':
# 运行所有的测试
unittest.main()
结果不能通过测试应为you没有变成You。
做测试的人可以发现这些边界条件,但是开发者在自己面对自己的代码时通常有盲区。
unittest提供了数量不多但非常有用的断言,你可以用它们检查值,确保类能够匹配、判断是否触发错误,等等。
使用doctest进行调试
标准库中的第二个测试包是doctest。使用这个包可以把测试写到文档字符串中,也可以起到文档的作用。它看起来有点像交互式解释器:字符>>>后面是一个函数调用,下一行是执行结果。
# cap.py
def just_do_it(text):
"""
>>> just_do_it('duck')
'Duck'
>>> just_do_it('a veritable flock of ducks')
'A Veritable Flock Of Ducks'
>>> just_do_it("I'm fresh out of ideas")
"I'm Fresh Out Of Idea"
```
from string import capwords
return capwords(text)
if __name__ = '__main__':
import doctest
doctest.testmod()
运行时如果测试全部通过不会产生任何输出:
$ python cap.py
加上冗杂选项(-v),看看会出现什么:
$ python cap.py -v
使用nose进行测试
第三方包nose和unittest类似。(pip install nose)不需要像使用unittest一样创建一个包含测试方法的类。任何名称中带test的函数都会被执行。
# test_cap_nose.py
import cap
from nose.tools import eq_
def test_one_word():
text = 'duck'
result = cap.just_do_it(text)
eq_(result, 'Duck')
def test_multiple_words():
text = 'a veritable flock of ducks'
result = cap.just_do_it(text)
eq_(result, 'A Veritable Flock Of Ducks')
def test_words_with_apostrophes():
text = "I'm fresh out of ideas"
result = cap.just_do_it(text)
eq_(result, "I'm Fresh Out Of Ideas")
def test_words_with_quotes():
text = "\"You're despicable,\" said Daffy Duck"
result = cap.just_do_it(text)
eq_(result, "\"You're Despicable,\" Said Daffy Duck")
运行测试:
$ nosetests test_cap_nose.py
其他测试框架
出于某些原因,开发者会编写Python测试框架。如果你很感兴趣,可以试试tox和py.test。
持续集成
调试Python代码
使用pdb进行调试
记录错误日志
优化代码
测量时间
算法和数据结构
Cython、NumPy和C扩展
PyPy
源码控制
Mercurial
Git
更多内容