The Hacker's Guide to Python

Reference: Danjou, Julien. The Hacker's Guide to Python. Lulu. com, 2016.

1. 项目开始

  • Python主流版本: 2.7, 3.3(3.4)
  • 项目结构
  • 版本编号
  • 编码风格与自动检查: PEP 8, 工具, 其他工具(pyflakes、pylint、flake8、hacking)

2. 模块和库

导入系统

  • sys.modules['os']
  • 内置模块(sys.builtin_module_names
  • 路径列表(sys.path),可以在代码中修改这个列表,根据需要添加或删除路径,也可以通过编写Python代码直接修改环境变量PYTHONPATH
  • 自定义导入器(importer)

标准库

  • atexit允许注册在程序退出时调用的函数
  • argparse提供解析命令行参数的函数
  • bisect为可排序列表提供二分查找算法
  • calendar提供一组与日期相关的函数
  • codecs提供编解码数据的函数
  • collections提供一组有用的数据结构
  • copy提供复制数据的函数
  • csv提供用于读写CSV文件的函数
  • datetime提供用于处理日期和时间的函数
  • fnmatch提供用于匹配Unix风格文件名模式的函数
  • glob提供用于匹配Unix风格路径模式的函数
  • io提供用于处理I/O流的函数。在Python3中,它还包含StringIO(在Python2中有同名的模块),可以像处理文件一样处理字符串
  • json提供用来读写JSON格式数据的函数
  • logging提供对Python内置的日志功能的访问
  • multiprocessing可以在应用程序中运行多个子进程,而且提供API让这些子进程看上去像线程一样
  • operator提供实现基本的Python运算符功能的函数,可以使用这些函数而不是自己写lambda表达式
  • os提供对基本的操作系统函数的访问
  • random提供生成伪随机数的函数
  • re提供正则表达式功能
  • select提供对函数select()poll()的访问,用于创建事件循环
  • shutil提供对高级文件处理函数的访问
  • signal提供用于处理POSIX信号的函数
  • tempfile提供用于创建临时文件和目录的函数
  • threading提供对处理高级线程功能的访问
  • urllib(以及Python 2.x中的urllib2urlparse)提供处理和解析URL的函数
  • uuid可以生成全局唯一标识符(Universally Unique Identifiers, UUID)

外部库

  • Python3兼容
  • 开发活跃
  • 维护活跃
  • 与各个操作系统发行版打包在一起
  • API兼容保证

框架

  • Web应用:DjangoFlaskPylonsTurboGearsTornadoZopePlone
  • 事件驱动框架:TwistedCircuits

3. 文档

Python中文档格式的事实标准是reStructuredText,或简称reST。它是一种轻量级的标记语言(类似流行的Markdown),在易于计算机处理的同时也便于人类读写。Sphinx是处理这一格式最常用的工具,它能读取reST格式的内容并输出其他格式的文档。

项目的文档应该包括下列内容:

  • 用一两句话描述这个项目要解决的问题。
  • 项目所基于的分发许可。如果是开源软件的话,应该在每一个代码文件中包含相应信息。因为上传代码到互联网并不意味着人们知道他们可以对代码做什么。
  • 一个展示项目如何工作的小例子。
  • 安装指南。
  • 指向社区支持、邮件列表、IRC、论坛等的链接。
  • 指向bug跟踪系统的链接。
  • 指向源代码的链接,以便开发人员可以下载并立刻投入开发。

4. 分发

  • distutils是标准库的一部分,能处理简单的包的安装。
  • setuptools,领先的包安装标准,曾经被废弃但现在又继续开发。
  • 使用pbr打包
  • 发布包到PyPI
  • 查看一个包中可用的入口点entry_point_inspector

5. 虚拟环境

6. 单元测试

7. 方法和装饰器

装饰器

  • 装饰器本质上是一个函数,接收其他函数作为参数,并将其以一个新的修改后的函数进行替换。
  • def wrapper(*args, **kwargs)
  • functools.update_wrapper
  • functools.wraps
  • inspect.getcallargs获取函数参数

方法

  • __self__显示方法绑定的对象
  • 静态方法: @staticmethod
  • 类方法(绑定到类而非它的实例):@classmethod
  • 抽象方法:abc.abstractmethod

super

  • 类方法mro()返回方法解析顺序(method resolution order)
  • 当请求类的实例访问其super对象的一个属性时,它会遍历MRO列表,并从第一个包含这个属性的类中返回这个属性。

8. 函数式编程

生成器

  • 当函数执行到yield语句时,它会像return语句那样返回一个值,但一个明显不同在于:解释器会保存对栈的引用,它将被用来在下一次调用next函数时恢复函数的执行。
  • 可以通过inspect.isgeneratorfunction检查一个函数是否是生成器
  • 可以调用send()函数来向生成器(yield)传入一个值

函数式

  • 列表解析:[i for i in (1, 2, 3)]
  • map
  • filter
  • enumerate
  • sorted
  • any、all
  • zip

  • functools.partial允许通过反转的方式创建一个包装器函数,它修改收到的参数而不是修改函数的行为
  • 内置比较函数:operator.le

itertools

  • chain
  • combinations
  • compress
  • count
  • cycle
  • dropwhile
  • groupby
  • permutations
  • product
  • takewhile

9. 抽象语法树

  • ast.parse
  • Hy编程语言是Lisp的一个变种,可以解析类Lisp语言并将其转换为标准的Python抽象语法树。

10. 性能与优化

  • collections.defaultdict
  • 性能分析工具: cProfile python -m cProfile myscript.py
  • Python字节码的反编译器:dis.dis
  • 二分查找:bisect.bisect和二分插入:bisect.insort
  • 内存使用情况:python -m memory_profiler object.py
  • Python中的类会把所有属性在一个字典内,这个字典本身被存在__dict__属性中。可以定义一个__slots__属性,用来指定该类的实例可用的属性;其作用在于可以将对象属性存储在一个list对象中,从而避免分配整个字典对象。
  • namedtuple允许动态创建一个继承自tuple的类
  • memoization: @functools.lru_cache(max_size=2)
  • PyPy
  • 通过缓冲区协议实现零复制:memoryview

11. 扩展与架构

构建事件驱动应用

  • Python2: 基于libev的库,如pyev
  • Python3: asyncio

12. RDBMS和ORM

PASS

13. Python3支持策略

  • 转换Python 2/3: six, 因为2 x 3 = 6。
  • 移植2to3: modernize

14. 少即是多

Written on June 15, 2017