possibly-used-before-assignment / E0606ΒΆ
Message emitted:
Possibly using variable %r before assignment
Description:
Emitted when a local variable is accessed before its assignment took place in both branches of an if/else switch.
Problematic code:
def check_lunchbox(items: list[str]):
if not items:
empty = True
print(empty) # [possibly-used-before-assignment]
Correct code:
def check_lunchbox(items: list[str]):
empty = False
if not items:
empty = True
print(empty)
Additional details:
You can use assert_never
to mark exhaustive choices:
from typing import assert_never
def handle_date_suffix(suffix):
if suffix == "d":
...
elif suffix == "m":
...
elif suffix == "y":
...
else:
assert_never(suffix)
if suffix in "dmy":
handle_date_suffix(suffix)
Or, instead of assert_never(), you can call a function with a return annotation of Never or NoReturn. Unlike in the general case, where by design pylint ignores type annotations and does its own static analysis, here, pylint treats these special annotations like a disable comment.
Pylint currently allows repeating the same test like this, even though this lets some error cases through, as pylint does not assess the intervening code:
if guarded():
var = 1
if guarded():
print(var) # emits possibly-used-before-assignment
you may be concerned that possibly-used-before-assignment
is not totally useful
in this instance. However, consider that pylint, as a static analysis tool, does
not know if guarded()
is deterministic or talks to
a database. (Likewise, for guarded
instead of guarded()
, any other
part of your program may have changed its value in the meantime.)
Created by the variables checker.