From 6aaabc521b8c06c2dc73a65d8625da59c961ae38 Mon Sep 17 00:00:00 2001 From: Nick Liu Date: Sat, 28 Jan 2023 23:28:01 +0800 Subject: [PATCH 1/3] use qualname in `TypeErrors` for functions --- vm/src/builtins/function.rs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/vm/src/builtins/function.rs b/vm/src/builtins/function.rs index 3ad2ec6f5cc..5d49fbdfbce 100644 --- a/vm/src/builtins/function.rs +++ b/vm/src/builtins/function.rs @@ -101,7 +101,7 @@ impl PyFunction { if nargs > nexpected_args { return Err(vm.new_type_error(format!( "{}() takes {} positional arguments but {} were given", - &self.code.obj_name, nexpected_args, nargs + self.qualname(), nexpected_args, nargs ))); } } @@ -133,7 +133,10 @@ impl PyFunction { let slot = &mut fastlocals[pos]; if slot.is_some() { return Err( - vm.new_type_error(format!("Got multiple values for argument '{name}'")) + vm.new_type_error(format!("{}() got multiple values for argument '{}'", + self.qualname(), + name + )) ); } *slot = Some(value); @@ -143,14 +146,17 @@ impl PyFunction { posonly_passed_as_kwarg.push(name); } else { return Err( - vm.new_type_error(format!("got an unexpected keyword argument '{name}'")) + vm.new_type_error(format!("{}() got an unexpected keyword argument '{}'", + self.qualname(), + name + )) ); } } if !posonly_passed_as_kwarg.is_empty() { return Err(vm.new_type_error(format!( "{}() got some positional-only arguments passed as keyword arguments: '{}'", - &self.code.obj_name, + self.qualname(), posonly_passed_as_kwarg.into_iter().format(", "), ))); } @@ -207,7 +213,7 @@ impl PyFunction { return Err(vm.new_type_error(format!( "{}() missing {} required positional argument{}: '{}{}{}'", - &self.code.obj_name, + self.qualname(), missing_args_len, if missing_args_len == 1 { "" } else { "s" }, missing.iter().join("', '"), From 57b65241b164bedb8cd5d334360f99cc109b679e Mon Sep 17 00:00:00 2001 From: Nick Liu Date: Sun, 29 Jan 2023 00:16:04 +0800 Subject: [PATCH 2/3] update unit tests --- Lib/test/test_dataclasses.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Lib/test/test_dataclasses.py b/Lib/test/test_dataclasses.py index 74e47c8117a..6bd9d37fadc 100644 --- a/Lib/test/test_dataclasses.py +++ b/Lib/test/test_dataclasses.py @@ -1954,8 +1954,6 @@ class R: self.assertEqual(new_sample.x, another_new_sample.x) self.assertEqual(sample.y, another_new_sample.y) - # TODO: RUSTPYTHON - @unittest.expectedFailure def test_dataclasses_qualnames(self): @dataclass(order=True, unsafe_hash=True, frozen=True) class A: @@ -3442,8 +3440,6 @@ class C: self.assertEqual(c1.x, 3) self.assertEqual(c1.y, 2) - # TODO: RUSTPYTHON - @unittest.expectedFailure def test_frozen(self): @dataclass(frozen=True) class C: @@ -3476,8 +3472,6 @@ class C: "keyword argument 'a'"): c1 = replace(c, x=20, a=5) - # TODO: RUSTPYTHON - @unittest.expectedFailure def test_invalid_field_name(self): @dataclass(frozen=True) class C: @@ -3521,8 +3515,6 @@ class C: with self.assertRaisesRegex(ValueError, 'init=False'): replace(c, y=30) - # TODO: RUSTPYTHON - @unittest.expectedFailure def test_classvar(self): @dataclass class C: From f2bb2469edff66401ebcd70f632a7d7a0236c13f Mon Sep 17 00:00:00 2001 From: Nick Liu Date: Tue, 31 Jan 2023 20:35:19 +0800 Subject: [PATCH 3/3] fix fmt errors --- vm/src/builtins/function.rs | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/vm/src/builtins/function.rs b/vm/src/builtins/function.rs index 5d49fbdfbce..8808eae9876 100644 --- a/vm/src/builtins/function.rs +++ b/vm/src/builtins/function.rs @@ -101,7 +101,9 @@ impl PyFunction { if nargs > nexpected_args { return Err(vm.new_type_error(format!( "{}() takes {} positional arguments but {} were given", - self.qualname(), nexpected_args, nargs + self.qualname(), + nexpected_args, + nargs ))); } } @@ -132,12 +134,11 @@ impl PyFunction { if let Some(pos) = argpos(code.posonlyarg_count..total_args, &name) { let slot = &mut fastlocals[pos]; if slot.is_some() { - return Err( - vm.new_type_error(format!("{}() got multiple values for argument '{}'", - self.qualname(), - name - )) - ); + return Err(vm.new_type_error(format!( + "{}() got multiple values for argument '{}'", + self.qualname(), + name + ))); } *slot = Some(value); } else if let Some(kwargs) = kwargs.as_ref() { @@ -145,12 +146,11 @@ impl PyFunction { } else if argpos(0..code.posonlyarg_count, &name).is_some() { posonly_passed_as_kwarg.push(name); } else { - return Err( - vm.new_type_error(format!("{}() got an unexpected keyword argument '{}'", - self.qualname(), - name - )) - ); + return Err(vm.new_type_error(format!( + "{}() got an unexpected keyword argument '{}'", + self.qualname(), + name + ))); } } if !posonly_passed_as_kwarg.is_empty() {