From 2feca2353f95b66497feea651c5ba267e687fee0 Mon Sep 17 00:00:00 2001 From: codeXsidd Date: Thu, 22 Oct 2026 16:07:04 +0530 Subject: [PATCH] fix: handle None defaults in positional decorator (issue #2845) --- googleapiclient/_helpers.py | 2 +- tests/test__helpers.py | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/googleapiclient/_helpers.py b/googleapiclient/_helpers.py index c63d08448e4..17d8bbc1a18 100644 --- a/googleapiclient/_helpers.py +++ b/googleapiclient/_helpers.py @@ -135,7 +135,7 @@ def positional_wrapper(*args, **kwargs): return positional_decorator else: args, _, _, defaults, _, _, _ = inspect.getfullargspec(max_positional_args) - return positional(len(args) - len(defaults))(max_positional_args) + return positional(len(args) - len(defaults or ()))(max_positional_args) def parse_unique_urlencoded(content): diff --git a/tests/test__helpers.py b/tests/test__helpers.py index 56df6f88079..8d520ca4ecb 100644 --- a/tests/test__helpers.py +++ b/tests/test__helpers.py @@ -55,6 +55,24 @@ def function3(pos, kwonly=None): with self.assertRaises(TypeError): function3(1, 2) + # Unspecified positional with no default arguments. + @_helpers.positional + def function4(pos1, pos2): + return pos1 + pos2 + + self.assertEqual(function4(1, 2), 3) + with self.assertRaises(TypeError): + function4(1, 2, 3) + + # Unspecified positional with no arguments. + @_helpers.positional + def function5(): + return True + + self.assertTrue(function5()) + with self.assertRaises(TypeError): + function5(1) + @mock.patch("googleapiclient._helpers.logger") def test_enforcement_warning(self, mock_logger): _helpers.positional_parameters_enforcement = _helpers.POSITIONAL_WARNING