Fail closed on class namespace alias mutations

This commit is contained in:
2026-07-02 19:35:51 +02:00
parent 2d951c759a
commit 7e7479fb6a
2 changed files with 150 additions and 0 deletions
+15
View File
@@ -933,6 +933,15 @@ def _class_body_module_mutation_names(cls):
return names
def _class_body_namespace_mutation_names(cls):
names = set()
namespace_aliases = set()
for stmt in cls.body:
names.update(_namespace_alias_mutation_target_names(stmt, namespace_aliases))
_update_namespace_aliases(stmt, namespace_aliases)
return names
def _apply_module_stmt_to_env(stmt, env, class_bindings=None):
names = _mutating_call_target_names(stmt)
if isinstance(stmt, ast.ClassDef):
@@ -1165,6 +1174,9 @@ def _update_input_types_aliases_from_unpack(target, value, aliases):
def _class_attr(cls, name, env):
value = _MISSING
aliases = set()
namespace_mutations = _class_body_namespace_mutation_names(cls)
if _name_invalidated_by(name, namespace_mutations):
return _INVALID
for stmt in cls.body:
mutating_targets = _mutating_call_target_names(stmt)
observed_targets = _arbitrary_call_observed_names(stmt)
@@ -1295,6 +1307,9 @@ def _input_types(cls, env, decorator_env):
value = _MISSING
aliases = set()
classmethod_shadowed = "classmethod" in decorator_env
namespace_mutations = _class_body_namespace_mutation_names(cls)
if _name_invalidated_by("INPUT_TYPES", namespace_mutations):
return None
for stmt in cls.body:
mutating_targets = _mutating_call_target_names(stmt)
observed_targets = _arbitrary_call_observed_names(stmt)