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 | None] = ContextVar("cv", default=None)
...
if cv.get() is None:
cv.set([])