Check if {module_name}.{name} is an uninitialized submodule in sys.modules.
(
module_name: Option<&String>,
name: &Py<PyStr>,
vm: &VirtualMachine,
)
| 461 | |
| 462 | /// Check if {module_name}.{name} is an uninitialized submodule in sys.modules. |
| 463 | fn is_uninitialized_submodule( |
| 464 | module_name: Option<&String>, |
| 465 | name: &Py<PyStr>, |
| 466 | vm: &VirtualMachine, |
| 467 | ) -> bool { |
| 468 | let mod_name = match module_name { |
| 469 | Some(n) => n.as_str(), |
| 470 | None => return false, |
| 471 | }; |
| 472 | let full_name = format!("{mod_name}.{name}"); |
| 473 | let sys_modules = match vm.sys_module.get_attr("modules", vm).ok() { |
| 474 | Some(m) => m, |
| 475 | None => return false, |
| 476 | }; |
| 477 | let sub_mod = match sys_modules.get_item(&full_name, vm).ok() { |
| 478 | Some(m) => m, |
| 479 | None => return false, |
| 480 | }; |
| 481 | let spec = match sub_mod.get_attr("__spec__", vm).ok() { |
| 482 | Some(s) if !vm.is_none(&s) => s, |
| 483 | _ => return false, |
| 484 | }; |
| 485 | spec.get_attr("_initializing", vm) |
| 486 | .ok() |
| 487 | .and_then(|v| v.try_to_bool(vm).ok()) |
| 488 | .unwrap_or(false) |
| 489 | } |
no test coverage detected