Repository navigation
Modernize test_inspect by adding real pos-only parameters #103406
Description
Right now test_inspect uses several hacks to pretend that some parameters are positional only:
cpython/Lib/test/test_inspect.py
Lines 2465 to 2469 in ecad802
| def test(po, pk, pod=42, pkd=100, *args, ko, **kwargs): | |
| pass | |
| sig = inspect.signature(test) | |
| po = sig.parameters['po'].replace(kind=P.POSITIONAL_ONLY) | |
| pod = sig.parameters['pod'].replace(kind=P.POSITIONAL_ONLY) |
cpython/Lib/test/test_inspect.py
Lines 2519 to 2522 in ecad802
| myparam = MyParameter(name='z', kind=inspect.Parameter.POSITIONAL_ONLY) | |
| myparams = collections.OrderedDict(sig.parameters, a=myparam) | |
| mysig = MySignature().replace(parameters=myparams.values(), | |
| return_annotation=sig.return_annotation) |
cpython/Lib/test/test_inspect.py
Lines 3047 to 3052 in ecad802
| def foo(a, b, c, d, **kwargs): | |
| pass | |
| sig = inspect.signature(foo) | |
| params = sig.parameters.copy() | |
| params['a'] = params['a'].replace(kind=Parameter.POSITIONAL_ONLY) | |
| params['b'] = params['b'].replace(kind=Parameter.POSITIONAL_ONLY) |
cpython/Lib/test/test_inspect.py
Lines 3559 to 3565 in ecad802
| def test(a_po, *, b, **kwargs): | |
| return a_po, kwargs | |
| sig = inspect.signature(test) | |
| new_params = list(sig.parameters.values()) | |
| new_params[0] = new_params[0].replace(kind=P.POSITIONAL_ONLY) | |
| test.__signature__ = sig.replace(parameters=new_params) |
cpython/Lib/test/test_inspect.py
Lines 4160 to 4166 in ecad802
| def test(a_po, b_po, c_po=3, foo=42, *, bar=50, **kwargs): | |
| return a_po, b_po, c_po, foo, bar, kwargs | |
| sig = inspect.signature(test) | |
| new_params = collections.OrderedDict(tuple(sig.parameters.items())) | |
| for name in ('a_po', 'b_po', 'c_po'): | |
| new_params[name] = new_params[name].replace(kind=P.POSITIONAL_ONLY) |
And maybe others.
It makes code more complex, unclear, and hides the real purpose of these tests.
This is not a design decision, but rather a limitation at the time. Commits are quite old and pos-only syntax was not available 9 and 11 years ago:
So, I propose to simplify these tests and make them more correct by using explicit pos only parameters.
Plus, we can keep one test like this to be sure that chaning a parameter kind still works as before. But, there's no need in keeping these old tests the way they are.
I will send a PR with the fix 👍
Activity
sobolevn commentedon Apr 10, 2023
Since all supported Python versions have pos-only parameters this can be backported to reduce the amount of potential future merge conflicts.
sobolevn commentedon Apr 10, 2023
Ok, some code samples that I've listed cannot be replaced, because they test different things. But, some - can be.
pythongh-103406: Modernize pos-only arguments usage in `test_signature`
pythongh-103406: Modernize pos-only arguments usage in `test_signatur…
gh-103406: Modernize pos-only arguments usage in `test_signature` (#1…
gh-103406: Modernize pos-only arguments usage in `test_signature` (GH…
Merge branch 'main' into superopt
Merge branch 'superopt' into superopt_spec