Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 33.9k
gh-87106: Fix inspect.signature.bind handling of positional-only arguments with **kwargs#103404
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Uh oh!
There was an error while loading. Please reload this page.
Merged
Changes from all commits
Commits
Show all changes
17 commits Select commit Hold shift + click to select a range
f2baf1a gh-87106: Fix `inspect.signature.bind` handling of positional-only ar…
jacobtylerwalls 487e217 fixup: double backticks
jacobtylerwalls c1e6af2 Merge branch 'main' into issue-87106
jacobtylerwalls b7cbfe4 Avoid having helper function start with "test"
jacobtylerwalls 600e778 Merge branch 'main' into issue-87106
jacobtylerwalls eebae66 Merge branch 'main' into issue-87106
jacobtylerwalls 1c7aa83 Merge branch 'main' into issue-87106
sobolevn cc2d7ba Opt for black style
jacobtylerwalls 366bb96 Simplify test case
jacobtylerwalls 2f792eb Add test cases
jacobtylerwalls 5951ad9 Use elif
jacobtylerwalls 2ecde83 Refactor to avoid pop-and-maybe-put-back pattern
jacobtylerwalls db2d925 Remove unnecessary cosmetic changes
jacobtylerwalls 6916290 Test multiple pos-only args passed by keyword
jacobtylerwalls 1ec398b Remove superfluous continue
jacobtylerwalls f1565de [tests] Use distinct value for c_po kwarg
jacobtylerwalls 52facb0 fixup! [tests] Use distinct value for c_po kwarg
jacobtylerwalls File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Uh oh!
There was an error while loading. Please reload this page.
Jump to
Jump to file
Failed to load files.
Loading
Uh oh!
There was an error while loading. Please reload this page.
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -3179,6 +3179,8 @@ def _bind(self, args, kwargs, *, partial=False): | ||
| parameters_ex = () | ||
| arg_vals = iter(args) | ||
| pos_only_param_in_kwargs = [] | ||
| while True: | ||
| # Let's iterate through the positional arguments and corresponding | ||
| # parameters | ||
| @@ -3199,10 +3201,10 @@ def _bind(self, args, kwargs, *, partial=False): | ||
| break | ||
| elif param.name in kwargs: | ||
| if param.kind == _POSITIONAL_ONLY: | ||
| msg = '{arg!r} parameter is positional only, ' \ | ||
| 'but was passed as a keyword' | ||
| msg = msg.format(arg=param.name) | ||
| raise TypeError(msg) from None | ||
| # Raise a TypeError once we are sure there is no | ||
| # **kwargs param later. | ||
| pos_only_param_in_kwargs.append(param) | ||
| continue | ||
serhiy-storchaka marked this conversation as resolved. Show resolvedHide resolvedUh oh!There was an error while loading. Please reload this page. | ||
| parameters_ex = (param,) | ||
| break | ||
| elif (param.kind == _VAR_KEYWORD or | ||
| @@ -3284,20 +3286,22 @@ def _bind(self, args, kwargs, *, partial=False): | ||
| format(arg=param_name)) from None | ||
| else: | ||
| if param.kind == _POSITIONAL_ONLY: | ||
| # This should never happen in case of a properly built | ||
| # Signature object (but let's have this check here | ||
| # to ensure correct behaviour just in case) | ||
| raise TypeError('{arg!r} parameter is positional only, ' | ||
| 'but was passed as a keyword'. \ | ||
| format(arg=param.name)) | ||
| arguments[param_name] = arg_val | ||
| if kwargs: | ||
| if kwargs_param is not None: | ||
| # Process our '**kwargs'-like parameter | ||
| arguments[kwargs_param.name] = kwargs | ||
| elif pos_only_param_in_kwargs: | ||
| raise TypeError( | ||
| 'got some positional-only arguments passed as ' | ||
| 'keyword arguments:{arg!r}'.format( | ||
| arg=', '.join( | ||
| param.name | ||
| for param in pos_only_param_in_kwargs | ||
| ), | ||
| ), | ||
| ) | ||
| else: | ||
| raise TypeError( | ||
| 'got an unexpected keyword argument{arg!r}'.format( | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -5072,15 +5072,30 @@ def test(a_po, b_po, c_po=3, /, foo=42, *, bar=50, **kwargs): | ||
| self.assertEqual(self.call(test, 1, 2, foo=4, bar=5), | ||
| (1, 2, 3, 4, 5,{})) | ||
| with self.assertRaisesRegex(TypeError, "but was passed as a keyword"): | ||
| self.call(test, 1, 2, foo=4, bar=5, c_po=10) | ||
| self.assertEqual(self.call(test, 1, 2, foo=4, bar=5, c_po=10), | ||
sobolevn marked this conversation as resolved. Show resolvedHide resolvedUh oh!There was an error while loading. Please reload this page. | ||
| (1, 2, 3, 4, 5, {'c_po': 10})) | ||
| with self.assertRaisesRegex(TypeError, "parameter is positional only"): | ||
| self.call(test, 1, 2, c_po=4) | ||
| self.assertEqual(self.call(test, 1, 2, 30, c_po=31, foo=4, bar=5), | ||
| (1, 2, 30, 4, 5,{'c_po': 31})) | ||
| with self.assertRaisesRegex(TypeError, "parameter is positional only"): | ||
| self.assertEqual(self.call(test, 1, 2, 30, foo=4, bar=5, c_po=31), | ||
| (1, 2, 30, 4, 5,{'c_po': 31})) | ||
| self.assertEqual(self.call(test, 1, 2, c_po=4), | ||
| (1, 2, 3, 42, 50,{'c_po': 4})) | ||
| with self.assertRaisesRegex(TypeError, "missing 2 required positional arguments"): | ||
| self.call(test, a_po=1, b_po=2) | ||
| def without_var_kwargs(c_po=3, d_po=4, /): | ||
| return c_po, d_po | ||
| with self.assertRaisesRegex( | ||
| TypeError, | ||
| "positional-only arguments passed as keyword arguments: 'c_po, d_po'", | ||
| ): | ||
| self.call(without_var_kwargs, c_po=33, d_po=44) | ||
| def test_signature_bind_with_self_arg(self): | ||
| # Issue #17071: one of the parameters is named "self | ||
| def test(a, self, b): | ||
3 changes: 3 additions & 0 deletions 3 Misc/NEWS.d/next/Library/2023-04-10-00-04-37.gh-issue-87106.UyBnPQ.rst
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| Fixed handling in :meth:`inspect.signature.bind` of keyword arguments having | ||
| the same name as positional-only arguments when a variadic keyword argument | ||
| (e.g. ``**kwargs``) is present. |
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.