第六章:内置模块(总结)
第42条:用functools.wraps定义函数修饰器
装饰器函数的执行顺序是分为(被装饰函数)定义阶段和(被装饰函数)执行阶段的,装饰器函数在被装饰函数定义好后立即执行 在函数定义阶段:执行顺序是从最靠近函数的装饰器开始,自内而外的执行 在函数执行阶段:执行顺序由外而内,一层层执行
总结:装饰器可以对函数进行封装,但是会改变函数信息,使用 functools 的 warps 可以解决这个问题
第43条:考虑以contextlib和with语句来改写可以复用的try/finally
本条建议大家使用with语句代替try/finally,增加代码可读性,但是博主是从Java转入的,所以还是习惯用try/finally
总结: 1.可以用with语句来改写try/finally块中的逻辑,以提升复用程度,并使代码更加整洁 2.内置的contextlib模块提供了名叫为contextmanager的修饰器,开发者只需要用它来修饰自己的函数,即可令该函数支持with语句 3.情景管理器可以通过yield语句向with语句返回一个值,此值会赋给由as关键字所指定的变量
第44条:用copyreg实现可靠的pickle操作
使用很麻烦,数据结构复杂时,建议还是直接抛弃 pickle,用 json 保存数据。
总结: 1.内置的pickle模块,只适合用来彼此信任的程序之间,对相关对象执行序列化和反序列化操作 2.如果用法比较复杂,那么pickle模块的功能可能就会出现问题,我们可以用内置的copyreg模块和pickle结合起来使用,以便为旧数据添加缺失的属性值、进行类的版本管理、并给序列化之后的数据提供固定的引入路径
第45条:应该用datetime模块来处理本地时间,而不是用time模块
time 模块依赖操作系统,没法处理不同时区之间的转换,datetime 处理时区实际上也依赖另一个模块,即 pytz 对时区的定义。开发者应该以 UTC 为中介进行时区转换。
总结: 1.不要用time模块在不同时区之间进行转换 2.如果要在不同时区之间,可靠地执行转换操作,那就应该把内置的datetime模块与开发者社区提供的pytz模块打起来使用 3.开发者总是应该先把时间表示为UTC格式,然后对其执行各种转换操作,最后再把它转回本地时间
第46条:使用内置算法与数据结构
双向队列 collections.deque 有序字典 dollections.OrderDict 带有默认值的有序字典 collections.defaultdict 堆队列(优先级队列)heapq.heap 二分查找 bisect模块中的bisect_left函数等提供了高效的二分折半搜索算法 与迭代器有关的工具 itertools模块
总结:使用 Python 内置的模块来描述各种算法和数据结构,开发者不应该自己去重新实现他们,因为我们很难把它写好。
第47条:在重视精确度的场合,应该使用decimal
精度丢失的问题在编写代码时应提前考虑到。
总结: 1.高精度计算应该使用 decimal 2.decimal模块中的Decimal类默认提供28个小数位,以进行定点数字运算,还可以按照开发射所要求的精度及四舍五入
第48条:学会安装由Python开发者社区所构建的模块
Python有个中央仓库在(pypi.python.org) 里面存放着各种模块,以供程序开发者安装使用。
总结:没啥可总结的,最基本的