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