From 7a84e2b6c97acde8e97f3341b8a8947a20570c43 Mon Sep 17 00:00:00 2001 From: Noah <33094578+coolreader18@users.noreply.github.com> Date: Wed, 17 Feb 2021 21:01:14 -0600 Subject: [PATCH] Respect module.__getattr__ --- vm/src/builtins/module.rs | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/vm/src/builtins/module.rs b/vm/src/builtins/module.rs index 06aee7dac..daa36e723 100644 --- a/vm/src/builtins/module.rs +++ b/vm/src/builtins/module.rs @@ -94,17 +94,24 @@ impl PyModule { impl SlotGetattro for PyModule { fn getattro(zelf: PyRef, name: PyStrRef, vm: &VirtualMachine) -> PyResult { - vm.generic_getattribute_opt(zelf.as_object().clone(), name.clone(), None)? - .ok_or_else(|| { - let module_name = if let Some(name) = Self::name(zelf, vm) { - format!(" '{}'", name) - } else { - "".to_owned() - }; - vm.new_attribute_error( - format!("module{} has no attribute '{}'", module_name, name,), - ) - }) + if let Some(attr) = + vm.generic_getattribute_opt(zelf.as_object().clone(), name.clone(), None)? + { + return Ok(attr); + } + if let Some(getattr) = zelf + .as_object() + .dict() + .and_then(|d| d.get_item("__getattr__", vm).ok()) + { + return vm.invoke(&getattr, (name,)); + } + let module_name = if let Some(name) = Self::name(zelf, vm) { + format!(" '{}'", name) + } else { + "".to_owned() + }; + Err(vm.new_attribute_error(format!("module{} has no attribute '{}'", module_name, name))) } }