improved logic for detecting uninitialized instance variables
in pyright, the reportUninitializedInstanceVariable
rule will report cases where an instance attribute is defined but not initialized:
class A:
x: int # error: Instance variable "x" is not initialized in the class body or __init__ method
def reset(self):
# there's no guarantee this will be called so it doesn't count
self.x = 3
however, it's very common to write constructors that call a "reset" method. pyright doesn't account for this, so reportUninitializedInstanceVariable
is still reported even though the attribute will always be initialized.
basedpyright checks the class's __init__
method for calls to other methods that may initialize instance attributes to eliminate such false positives:
class A:
x: int # error in pyright, no error in basedpyright
def __init__(self) -> None:
self.reset()
def reset(self):
self.x = 3
limitations
for performance reasons, this only checks one call deep from the __init__
method, so the following class will still report an error:
class A:
x: int # reportUninitializedInstanceVariable error
def __init__(self) -> None:
self.initialize()
def initialize(self):
self.reset()
def reset(self):
self.x = 3
although this compromise is not ideal, we've found that this change still eliminates a very common source of false positives for this rule.