diff --git a/crates/vm/src/builtins/function.rs b/crates/vm/src/builtins/function.rs index c6c4aaf2b..b0bd5a010 100644 --- a/crates/vm/src/builtins/function.rs +++ b/crates/vm/src/builtins/function.rs @@ -1321,9 +1321,7 @@ impl Constructor for PyFunction { let mut func = Self::new(args.code.clone(), args.globals.clone(), vm)?; // Set function name if provided if let Some(name) = args.name.into_option() { - *func.name.lock() = name.clone(); - // Also update qualname to match the name - *func.qualname.lock() = name; + *func.name.lock() = name; } // Now set additional attributes directly if let Some(closure_tuple) = closure { diff --git a/extra_tests/snippets/stdlib_types.py b/extra_tests/snippets/stdlib_types.py index bffc9f824..892daeb4b 100644 --- a/extra_tests/snippets/stdlib_types.py +++ b/extra_tests/snippets/stdlib_types.py @@ -66,3 +66,18 @@ if sys.implementation.name == "rustpython": deep_alias = list[deep_alias] with assert_raises(RecursionError): hash(deep_alias) + + +# FunctionType preserves the code qualified name when a name is supplied. +def outer(): + def nested(): + pass + + return nested + + +original = outer() +for name in ("renamed", ""): + function = types.FunctionType(original.__code__, globals(), name) + assert function.__name__ == name + assert function.__qualname__ == "outer..nested"