mutable-contextvar-default (B039)
Derived from the flake8-bugbear linter.
This rule is unstable and in preview. The --preview
flag is required for use.
What it does
Checks for uses of mutable objects as ContextVar
defaults.
Why is this bad?
The ContextVar
default is evaluated once, when the ContextVar
is defined.
The same mutable object is then shared across all .get()
method calls to
the ContextVar
. If the object is modified, those modifications will persist
across calls, which can lead to unexpected behavior.
Instead, prefer to use immutable data structures; or, take None
as a
default, and initialize a new mutable object inside for each call using the
.set()
method.
Types outside the standard library can be marked as immutable with the
lint.flake8-bugbear.extend-immutable-calls
configuration option.
Example
Use instead:
from contextvars import ContextVar
cv: ContextVar[list | None] = ContextVar("cv", default=None)
...
if cv.get() is None:
cv.set([])
Options
References
- [Python documentation:
contextvars
— Context Variables