成为真正的Python开发者

53 篇文章 1 订阅

寻找Python代码

  1. Python标准库
  2. Python包索引(PyPi
    善于用右上角的模糊搜索功能
  3. Github中最流行的Python项目(https://github.com/trending/python
  4. 流行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上。如果要安装这样的包,通常需要这样做:

  1. 下载代码
  2. 如果是压缩文件,使用zip、tar或者其他合适的工具来解压缩
  3. 在包含setup.py文件的目录中运行python install setup.py

集成开发环境

IDLE

IDLE是唯一一个标准发行版中包含的Python IDE。它是基于tkinter开发的,图形界面比较简单。

PyCharm

IPython

IPython在后面有介绍,既是一个发布平台也是一个扩展IDE。

命名和文档

文档可以包括注释和文档字符串,也可以把信息记录在变量名、函数名、模块名和类名中。

PEP8格式

注意:

  1. Python没有常量,但是PEP8格式规范建议使用大写字母和下划线来表示常量名。
  2. 我们基于常量值提前进行了一些计算,应该把它们移动到模块顶层,如果把他们放到函数内部,则每次调用函数都要重新计算。

测试代码

测试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

更多内容

这里写图片描述
这里写图片描述

Python的艺术

工作中的Python

Python的科学

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值