this
Python 之禅:
1 | >>> import this |
decimal
假如你的程序需要精确的浮点数计算,请考虑使用 decimal.Decimal 对象来代替普通浮点数:
1 | >>> from decimal import Decimal |
locale
如果不指定 encoding,Python 将通过 locale 模块获取系统偏好的编码格式:
1 | >>> import locale |
dis
dis 的全称是 Disassembler for Python Bytecode,在解释器真正运行 Python 代码前,其实仍然有一个类似编译的加速过程:将代码编译为二进制的字节码。我们没法直接读取字节码,但利用内置的 dis 模块,可以将它们反汇编成人类可读的内容:
1 | def do_something(delta_seconds): |
1 | >>> import dis |
第 4 行表示 Python 解释器在将源码编译成字节码时,会主动计算 11 * 24 * 3600 表达式的结果,并用 950400 替换它。也就是说,无论你调用 do_something 多少次,其中的算式都只会在编译期被执行 1 次。
解释器除了会预计算数值表达式外,还会对字符串、列表执行类似的操作。
textwrap
在已经有缩进层级的代码里,插入多行字符串字面量,为了让字符串不要包含当前缩进里的空格,我们必须把代码写成这样:
1 | def main(): |
可以用标准库 textwrap 来解决这个问题,dedent 方法会删除字符串左侧的空白缩进。使用它来处理多行字符串以后,整段代码的缩进视觉效果就能保持正常了:
1 | from textwrap import dedent |
timeit
利用 Python 的内置模块 timeit,我们可以非常方便地测试代码的执行效率:
1 | WORDS = ['Hello', 'string', 'performance', 'test'] * 25 |
然后,导入 timeit 模块,定义性能测试:
1 | import timeit |
1 | cat_spent: 7.844882188 |
contextlib
如果你在真实项目中要忽略某类异常,可以直接使用标准库模块 contextlib 里的 suppress 函数:
1 | from contextlib import suppress |
pydantic
在数据校验方面,pydantic 模块是一个不错的选择:
1 | def input_a_number(): |
1 | from pydantic import BaseModel, conint, ValidationError |
radon
在 Python 中,你可以通过 radon 工具计算一个函数的圈复杂度:
1 | def rank(rating): |
1 | $ radon cc complex_func.py -s |