Preserve missing caller modules in eager type aliases (#9073)

Only lazy aliases may obtain their module from the evaluation function. Eager aliases without a caller __name__ must not inspect their stored value.

Assisted-by: OpenAI Codex:model identifier unavailable
This commit is contained in:
youknowdot authored and GitHub committed 2026-10-10 21:05:21 +00:00
1 parent 1ff5bbd920
commit 44858012f4
2 files changed
+24 -1

No files matched your search

+3 -1
View File
@@ -321,7 +321,9 @@ pub(crate) mod decl {
return module.clone();
}
// Fall back to compute_value's __module__ (like PyFunction_GetModule)
if let Ok(module) = self.compute_value.get_attr("__module__", vm) {
if self.is_lazy
&& let Ok(module) = self.compute_value.get_attr("__module__", vm)
{
return module;
}
vm.ctx.none()
+21
View File
@@ -63,3 +63,24 @@ try:
repr(nested)
except RecursionError:
pass
# Eager aliases without a caller module never inspect their aliased value.
alias_module_lookups = []
class AliasModuleValue:
@property
def __module__(self):
alias_module_lookups.append(True)
return "unexpected_value_module"
for alias_value in (int, AliasModuleValue()):
alias_namespace = {"value": alias_value}
exec(
"from typing import TypeAliasType; alias = TypeAliasType('Alias', value)",
alias_namespace,
)
assert alias_namespace["alias"].__module__ is None
assert alias_module_lookups == []