diff --git a/Lib/test/test_str.py b/Lib/test/test_str.py index 15cee0d3a..56fccea7d 100644 --- a/Lib/test/test_str.py +++ b/Lib/test/test_str.py @@ -2414,7 +2414,6 @@ class StrTest(string_tests.StringLikeTest, else: self.fail("Should have raised UnicodeDecodeError") - @unittest.expectedFailure # TODO: RUSTPYTHON; AssertionError: is not def test_conversion(self): # Make sure __str__() works properly class StrWithStr(str): diff --git a/crates/vm/src/builtins/str.rs b/crates/vm/src/builtins/str.rs index b94893fe9..40c9905c1 100644 --- a/crates/vm/src/builtins/str.rs +++ b/crates/vm/src/builtins/str.rs @@ -406,6 +406,18 @@ impl Constructor for PyStr { } let args: Self::Args = func_args.bind(vm)?; + + // CPython parity: when cls is exactly str, return the __str__ / __repr__ + // result as-is so any str subclass type the user returned is preserved + // (matches unicode_new_impl which only invokes unicode_subtype_new when + // type != &PyUnicode_Type). + if cls.is(vm.ctx.types.str_type) + && args.encoding.is_missing() + && let OptionalArg::Present(input) = &args.object + { + return Ok(input.str(vm)?.into()); + } + let payload = Self::py_new(&cls, args, vm)?; payload.into_ref_with_type(vm, cls).map(Into::into) }