跳转至

Python

Python @overload 装饰器约束函数签名

Python 中的 @overload 装饰器用于向类型检查器声明:同一函数拥有不同的参数和返回值类型组合。其核心作用是让类型检查器能够根据调用时的实际参数值,推断出更精确的返回类型,从而避免不必要的类型断言或空值检查。它仅作用于静态类型分析阶段,不影响运行时行为。

本文介绍了 @overload 的使用动机、正确写法及类型检查效果对比。

pandas rolling exponential 滚动计算指数加权标准差会受起点影响

在使用 rolling(win_type="exponential").std() 计算标准差时,结果可能会受数据起点的影响。

本文将通过几个简单的代码示例,探究数据具有不同数据起点(通过 iloc[1:] 手动构造不同的数据起点进行模拟)对 Pandas rolling(win_type="exponential").std() 计算结果的影响,并提供了一个自定义函数实现严格控制滚动回看窗口,以获得一致的结果。

使用 papermill 运行 Jupyter Notebook

当执行两个具有前后依赖关系的 Jupyter Notebook 时,我们需要等待第一个 Notebook 运行完成,再开始运行第二个 Notebook。

一个笨拙的方法是,先预估好第一个 Notebook 运行需要的时间(例如 1 小时),然后在第二个 Notebook 的第一个 Cell 添加:

Python
import time

time.sleep(1 * 60 * 60)

这将使第二个 Notebook 运行 1 小时后,再运行后续的 Cell。

上述方法需要事先预估第一个 Notebook 运行需要的时间,预估时间过短会导致第二个 Notebook 提前运行,预估时间过长又会导致第二个 Notebook 浪费很多时间在 time.sleep() 上。

本文介绍了如何使用 papermill 运行 Jupyter Notebook,实现控制先后运行两个 Notebook 的功能。

screen-capture

pypika 中自定义 SQL 函数

pypika 是一个在 Python 中构建 SQL 语句的工具。这篇文章提供了一个很棒的入门教程,介绍了许多 pypika 的基本用法。

本文以 ClickHouse 中的 quantileExact 函数为例,介绍如何在 pypika 中自定义函数,尤其是自定义字符串拼接方式的实现方法。

image-20240711001853859

Python 类型检查工具 beartype

Python 代码中的类型提示并不是需要强制满足的。如果我们希望代码使用者严格遵循类型提示,在类型不符时抛出错误,可以使用 beartype 进行类型检查。

静态类型检查推荐使用 pyright

beartype 的功能是:当你真正调用函数时,才进行参数和返回值的类型检查。若我们不想真正运行代码,而只希望进行静态类型检查,可以使用 pyright

多线程下调试 Python 代码

当启用 n_jobs 超过 1 时,直接调试 Python 代码可能会报错 "Couldn't find a debug adapter descriptor for debug type 'Python Kernel Debug Adapter' (extension might have failed to activate)"

image-20240325190005418

本文记录了一个解决方案,可以在 n_jobs 超过 1 的多线程环境下调试 Python 代码。