MCPcopy Index your code
hub / github.com/RustPython/RustPython / import_module_level

Function import_module_level

crates/vm/src/import.rs:369–494  ·  view source on GitHub ↗

PyImport_ImportModuleLevelObject

(
    name: &Py<PyStr>,
    globals: Option<PyObjectRef>,
    fromlist: Option<PyObjectRef>,
    level: i32,
    vm: &VirtualMachine,
)

Source from the content-addressed store, hash-verified

367
368/// PyImport_ImportModuleLevelObject
369pub(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

Callers 1

__import__Function · 0.85

Calls 15

calc_packageFunction · 0.85
to_strMethod · 0.80
new_import_errorMethod · 0.80
new_key_errorMethod · 0.80
new_dictMethod · 0.80
new_utf8_strMethod · 0.80
try_to_boolMethod · 0.80
get_attribute_optMethod · 0.80
intern_strMethod · 0.80
resolve_nameFunction · 0.70
ErrClass · 0.50

Tested by

no test coverage detected