PyImport_ImportModuleLevelObject
(
name: &Py<PyStr>,
globals: Option<PyObjectRef>,
fromlist: Option<PyObjectRef>,
level: i32,
vm: &VirtualMachine,
)
| 367 | |
| 368 | /// PyImport_ImportModuleLevelObject |
| 369 | pub(crate) fn import_module_level( |
| 370 | name: &Py<PyStr>, |
| 371 | globals: Option<PyObjectRef>, |
| 372 | fromlist: Option<PyObjectRef>, |
| 373 | level: i32, |
| 374 | vm: &VirtualMachine, |
| 375 | ) -> PyResult { |
| 376 | if level < 0 { |
| 377 | return Err(vm.new_value_error("level must be >= 0")); |
| 378 | } |
| 379 | |
| 380 | let name_str = match name.to_str() { |
| 381 | Some(s) => s, |
| 382 | None => { |
| 383 | // Name contains surrogates. Like CPython, try sys.modules |
| 384 | // lookup with the Python string key directly. |
| 385 | if level == 0 { |
| 386 | let sys_modules = vm.sys_module.get_attr("modules", vm)?; |
| 387 | return sys_modules.get_item(name, vm).map_err(|_| { |
| 388 | vm.new_import_error(format!("No module named '{}'", name), name.to_owned()) |
| 389 | }); |
| 390 | } |
| 391 | return Err(vm.new_import_error(format!("No module named '{}'", name), name.to_owned())); |
| 392 | } |
| 393 | }; |
| 394 | |
| 395 | // Resolve absolute name |
| 396 | let abs_name = if level > 0 { |
| 397 | // When globals is not provided (Rust None), raise KeyError |
| 398 | // matching resolve_name() where globals==NULL |
| 399 | if globals.is_none() { |
| 400 | return Err(vm.new_key_error(vm.ctx.new_str("'__name__' not in globals").into())); |
| 401 | } |
| 402 | let globals_ref = globals.as_ref().unwrap(); |
| 403 | // When globals is Python None, treat like empty mapping |
| 404 | let empty_dict_obj; |
| 405 | let globals_ref = if vm.is_none(globals_ref) { |
| 406 | empty_dict_obj = vm.ctx.new_dict().into(); |
| 407 | &empty_dict_obj |
| 408 | } else { |
| 409 | globals_ref |
| 410 | }; |
| 411 | let package = calc_package(Some(globals_ref), vm)?; |
| 412 | if package.is_empty() { |
| 413 | return Err(vm.new_import_error( |
| 414 | "attempted relative import with no known parent package", |
| 415 | vm.ctx.new_utf8_str(""), |
| 416 | )); |
| 417 | } |
| 418 | resolve_name(name_str, &package, level as usize, vm)? |
| 419 | } else { |
| 420 | if name_str.is_empty() { |
| 421 | return Err(vm.new_value_error("Empty module name")); |
| 422 | } |
| 423 | name_str.to_owned() |
| 424 | }; |
| 425 | |
| 426 | // import_get_module + import_find_and_load |
no test coverage detected