跳到内容

mutable-contextvar-default (B039)

源自 flake8-bugbear linter。

作用

检查是否使用了可变对象作为 ContextVar 的默认值。

为什么这不好?

ContextVar 的默认值只在定义 ContextVar 时被评估一次。

然后,相同的可变对象将在所有对 ContextVar.get() 方法调用之间共享。如果对象被修改,这些修改将在所有调用中持续存在,这可能导致意外行为。

相反,建议使用不可变的数据结构。或者,将 None 作为默认值,并在每次调用中使用 .set() 方法在内部初始化一个新的可变对象。

标准库之外的类型可以使用 lint.flake8-bugbear.extend-immutable-calls 配置选项标记为不可变。

示例

from contextvars import ContextVar


cv: ContextVar[list] = ContextVar("cv", default=[])

建议改为

from contextvars import ContextVar


cv: ContextVar[list | None] = ContextVar("cv", default=None)

...

if cv.get() is None:
    cv.set([])

Options (选项)

参考