《Python黑魔法手册》摘抄
感谢作者王炳明写了这么多内容。这本《Python黑魔法手册》语言平实,举例得当。虽然前面有些简单的 “黑魔法” 我看来也就是 “茴香豆的四种写法”,但后面高级的、有趣的内容也不少,这里摘一摘。
2.14 把模块当做脚本来执行 7 种方法及原理 (python -m
)
介绍了 python -m
的机制
3.6 海象运算符的三种用法 (:=
)
介绍了 python 3.8 引入的 :=
3.8 Python 转义的五种表示法
其实我在意的是那个 “垂直定位符”,感觉会是格式化输出的神器……
3.10 装饰器的六种写法 (decorator)
很好的复习材料
4.2 深入理解描述符 (descriptor)
不光介绍了 descriptor,还研究了下如何用 descriptor 实现 @property
、@classmethod
、@staticmethod
4.3 神奇的元类编程
很好的复习材料
5.3 单行实现 for 死循环如何写 + 5.6 如何流式读取数G超大文件 (iter(callable, sentinel)
)
iter()
的完全体:iter(object[, sentinel])
,参考 Built-in Functions: iter:
- 不带
sentinel
参数时:- 要求
object
要么实现 iteration protocol (i.e.__iter__()
),要么实现 sequence protocol (i.e.__getitem__()
) - 否则
TypeError
- 要求
- 带
sentinel
参数时:- 要求
object
是一个 callable - iterator 运行至
object() == sentinel
为止
- 要求
因为 int()
一定返回 0
,所以 iter(int, 1)
就是个 infinite 的 0
generator
5.4 如何关闭异常自动关联上下文 (raise e2 from e1
)
方便你控制 exception stack
5.7 实现类似 defer 的延迟调用 + 5.11 在程序退出前执行代码的技巧
register 一个 hook/callback 在 context manager 退出后执行:
# magic0507.py
import contextlib
def callback():
print('Goodbye!')
with contextlib.ExitStack() as stack:
stack.callback(callback)
print("Hello!")
user@host % python3 magic0507.py
Hello!
Goodbye!
register 一个 hook/callback 在 script 退出后执行:
# magic0511.py
import atexit
@atexit.register
def run_on_exit():
print("Goodbye!")
1/0
user@host % python3 magic0511.py
Traceback (most recent call last):
File "magic0511.py", line 7, in <module>
1/0
ZeroDivisionError: division by zero
Goodbye!
5.14 单分派泛函数如何写 (@singledispatch
)
这个问题在 Single Dispatch in Java and Python 讲得很详细了。下面搬个例子:
from functools import singledispatch
# 有点 abstract function 的意思;感觉不应该实现任何具体的逻辑
@singledispatch
def foo(x):
print('Received x={} of {}'.format(x, type(x)))
# 注意你是做为 `foo` 的 polymorphic function,所以是 `@foo.register`
@foo.register(int)
def _(x):
print('Received an integer x={}'.format(x))
@foo.register(str)
def _(x):
print('Received a string x="{}"'.format(x))
foo(None)
foo(42)
foo("Fourty Two")
# Output:
# Received x=None of <class 'NoneType'>
# Received an integer x=42
# Received a string x="Fourty Two"
原文的例子也很有说服力。
5.20 让你晕头转向的 else 用法
就 Python 还有 for-else
的用法……
5.24 对齐字符串的两种方法
格式化输出利器
7.1 远程登陆服务器的最佳利器 (paramiko
库)
7.2 代码 BUG 变得酷炫的利器 (pretty-errors
库)
7.4 规整字符串提取数据的神器 (parse
库)
7.5 一行代码让代码运行速度提高100倍 (numba
& jit
)
这个坑就有点深了,有空再研究吧
7.6 新一代的调试神器:PySnooper
调试这块的技术也的确需要升级了,有空深入研究一下
Comments