Skip to content

Commit 4485801

Browse files
authored
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
1 parent 1ff5bbd commit 4485801

2 files changed

Lines changed: 24 additions & 1 deletion

File tree

‎crates/vm/src/stdlib/_typing.rs‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,9 @@ pub(crate) mod decl {
321321
return module.clone();
322322
}
323323
// Fall back to compute_value's __module__ (like PyFunction_GetModule)
324-
if let Ok(module) = self.compute_value.get_attr("__module__", vm) {
324+
if self.is_lazy
325+
&& let Ok(module) = self.compute_value.get_attr("__module__", vm)
326+
{
325327
return module;
326328
}
327329
vm.ctx.none()

‎extra_tests/snippets/stdlib_typing.py‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,24 @@ def method(self, value: Union[int, float]) -> Union[str, bytes]:
6363
repr(nested)
6464
except RecursionError:
6565
pass
66+
67+
68+
# Eager aliases without a caller module never inspect their aliased value.
69+
alias_module_lookups = []
70+
71+
72+
class AliasModuleValue:
73+
@property
74+
def __module__(self):
75+
alias_module_lookups.append(True)
76+
return "unexpected_value_module"
77+
78+
79+
for alias_value in (int, AliasModuleValue()):
80+
alias_namespace = {"value": alias_value}
81+
exec(
82+
"from typing import TypeAliasType; alias = TypeAliasType('Alias', value)",
83+
alias_namespace,
84+
)
85+
assert alias_namespace["alias"].__module__ is None
86+
assert alias_module_lookups == []

0 commit comments

Comments
 (0)