class documentation

class PossiblyUndefinedVariableVisitor(ExtendedTraverserVisitor): (source)

View In Hierarchy

Detects the following cases: - A variable that's defined only part of the time. - If a variable is used before definition An example of a partial definition: if foo(): x = 1 print(x) # Error: "x" may be undefined. Example of a used before definition: x = y y: int = 2 Note that this code does not detect variables not defined in any of the branches -- that is handled by the semantic analyzer.

Method __init__ Undocumented
Method process_definition Undocumented
Method process_lvalue Undocumented
Method process_try_stmt Processes try statement decomposing it into the following: if ...: body else_body elif ...: except 1 elif ...: except 2 else: except n finally
Method var_used_before_def Undocumented
Method variable_may_be_undefined Undocumented
Method visit_as_pattern Undocumented
Method visit_assert_stmt Undocumented
Method visit_assignment_expr Undocumented
Method visit_assignment_stmt Undocumented
Method visit_break_stmt Undocumented
Method visit_class_def Undocumented
Method visit_continue_stmt Undocumented
Method visit_dictionary_comprehension Undocumented
Method visit_expression_stmt Undocumented
Method visit_for_stmt Undocumented
Method visit_func Undocumented
Method visit_func_def Undocumented
Method visit_generator_expr Undocumented
Method visit_global_decl Undocumented
Method visit_if_stmt Undocumented
Method visit_import Undocumented
Method visit_import_from Undocumented
Method visit_lambda_expr Undocumented
Method visit_match_stmt Undocumented
Method visit_name_expr Undocumented
Method visit_nonlocal_decl Undocumented
Method visit_raise_stmt Undocumented
Method visit_return_stmt Undocumented
Method visit_starred_pattern Undocumented
Method visit_try_stmt Note that finding undefined vars in `finally` requires different handling from the rest of the code. In particular, we want to disallow skipping branches due to jump statements in except/else clauses for finally but not for other cases...
Method visit_while_stmt Undocumented
Method visit_with_stmt Undocumented
Instance Variable builtins Undocumented
Instance Variable loops Undocumented
Instance Variable msg Undocumented
Instance Variable options Undocumented
Instance Variable tracker Undocumented
Instance Variable try_depth Undocumented
Instance Variable type_map Undocumented

Inherited from ExtendedTraverserVisitor:

Method visit Undocumented
Method visit_assert_type_expr Undocumented
Method visit_await_expr Undocumented
Method visit_block Undocumented
Method visit_bytes_expr Undocumented
Method visit_call_expr Undocumented
Method visit_cast_expr Undocumented
Method visit_class_pattern Undocumented
Method visit_comparison_expr Undocumented
Method visit_complex_expr Undocumented
Method visit_conditional_expr Undocumented
Method visit_decorator Undocumented
Method visit_del_stmt Undocumented
Method visit_dict_expr Undocumented
Method visit_ellipsis Undocumented
Method visit_enum_call_expr Undocumented
Method visit_float_expr Undocumented
Method visit_import_all Undocumented
Method visit_index_expr Undocumented
Method visit_int_expr Undocumented
Method visit_list_comprehension Undocumented
Method visit_list_expr Undocumented
Method visit_mapping_pattern Undocumented
Method visit_member_expr Undocumented
Method visit_mypy_file Undocumented
Method visit_namedtuple_expr Undocumented
Method visit_newtype_expr Undocumented
Method visit_op_expr Undocumented
Method visit_operator_assignment_stmt Undocumented
Method visit_or_pattern Undocumented
Method visit_overloaded_func_def Undocumented
Method visit_paramspec_expr Undocumented
Method visit_pass_stmt Undocumented
Method visit_reveal_expr Undocumented
Method visit_sequence_pattern Undocumented
Method visit_set_comprehension Undocumented
Method visit_set_expr Undocumented
Method visit_singleton_pattern Undocumented
Method visit_slice_expr Undocumented
Method visit_star_expr Undocumented
Method visit_str_expr Undocumented
Method visit_super_expr Undocumented
Method visit_tuple_expr Undocumented
Method visit_type_alias Undocumented
Method visit_type_alias_expr Undocumented
Method visit_type_application Undocumented
Method visit_type_var_expr Undocumented
Method visit_type_var_tuple_expr Undocumented
Method visit_typeddict_expr Undocumented
Method visit_unary_expr Undocumented
Method visit_value_pattern Undocumented
Method visit_yield_expr Undocumented
Method visit_yield_from_expr Undocumented

Inherited from NodeVisitor (via ExtendedTraverserVisitor, TraverserVisitor):

Method visit__promote_expr Undocumented
Method visit_placeholder_node Undocumented
Method visit_temp_node Undocumented
Method visit_var Undocumented
def __init__(self, msg: MessageBuilder, type_map: dict[Expression, Type], options: Options, names: SymbolTable): (source)
def process_definition(self, name: str): (source)

Undocumented

def process_lvalue(self, lvalue: Lvalue|None): (source)

Undocumented

def process_try_stmt(self, o: TryStmt): (source)

Processes try statement decomposing it into the following: if ...: body else_body elif ...: except 1 elif ...: except 2 else: except n finally

def var_used_before_def(self, name: str, context: Context): (source)

Undocumented

def variable_may_be_undefined(self, name: str, context: Context): (source)

Undocumented

def visit_as_pattern(self, o: AsPattern): (source)
def visit_break_stmt(self, o: BreakStmt): (source)
def visit_class_def(self, o: ClassDef): (source)
def visit_for_stmt(self, o: ForStmt): (source)
def visit_func(self, o: FuncItem): (source)
def visit_func_def(self, o: FuncDef): (source)
def visit_if_stmt(self, o: IfStmt): (source)
def visit_import(self, o: Import): (source)
def visit_match_stmt(self, o: MatchStmt): (source)
def visit_name_expr(self, o: NameExpr): (source)
def visit_raise_stmt(self, o: RaiseStmt): (source)
def visit_try_stmt(self, o: TryStmt): (source)

Note that finding undefined vars in `finally` requires different handling from the rest of the code. In particular, we want to disallow skipping branches due to jump statements in except/else clauses for finally but not for other cases. Imagine a case like: def f() -> int: try: x = 1 except: # This jump statement needs to be handled differently depending on whether or # not we're trying to process `finally` or not. return 0 finally: # `x` may be undefined here. pass # `x` is always defined here. return x

def visit_while_stmt(self, o: WhileStmt): (source)
def visit_with_stmt(self, o: WithStmt): (source)
builtins = (source)

Undocumented

Undocumented

Undocumented

Undocumented

Undocumented

try_depth: int = (source)

Undocumented

type_map = (source)

Undocumented