summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_inspect.py
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2023-04-22 15:13:02 (GMT)
committerGitHub <noreply@github.com>2023-04-22 15:13:02 (GMT)
commitb2fdae9d86cd91fc75ca6a91f772cf805d536f42 (patch)
tree3fcfb845fcc810b82531a6e45a0ddff3308180b0 /Lib/test/test_inspect.py
parent2b5dbd1f237a013defdaf0799e0a1a3cbd0b13cc (diff)
downloadcpython-b2fdae9d86cd91fc75ca6a91f772cf805d536f42.zip
cpython-b2fdae9d86cd91fc75ca6a91f772cf805d536f42.tar.gz
cpython-b2fdae9d86cd91fc75ca6a91f772cf805d536f42.tar.bz2
[3.11] gh-103556: [inspect.Signature] disallow pos-or-kw params without default after pos-only with default (GH-103557) (#103675)
Diffstat (limited to 'Lib/test/test_inspect.py')
-rw-r--r--Lib/test/test_inspect.py40
1 files changed, 34 insertions, 6 deletions
diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py
index 9f597e2..efcbd63 100644
--- a/Lib/test/test_inspect.py
+++ b/Lib/test/test_inspect.py
@@ -2301,18 +2301,43 @@ class TestSignatureObject(unittest.TestCase):
self.assertEqual(str(S()), '()')
self.assertEqual(repr(S().parameters), 'mappingproxy(OrderedDict())')
- def test(po, pk, pod=42, pkd=100, *args, ko, **kwargs):
+ def test(po, /, pk, pkd=100, *args, ko, kod=10, **kwargs):
pass
+
sig = inspect.signature(test)
- po = sig.parameters['po'].replace(kind=P.POSITIONAL_ONLY)
- pod = sig.parameters['pod'].replace(kind=P.POSITIONAL_ONLY)
+ self.assertTrue(repr(sig).startswith('<Signature'))
+ self.assertTrue('(po, /, pk' in repr(sig))
+
+ # We need two functions, because it is impossible to represent
+ # all param kinds in a single one.
+ def test2(pod=42, /):
+ pass
+
+ sig2 = inspect.signature(test2)
+ self.assertTrue(repr(sig2).startswith('<Signature'))
+ self.assertTrue('(pod=42, /)' in repr(sig2))
+
+ po = sig.parameters['po']
+ pod = sig2.parameters['pod']
pk = sig.parameters['pk']
pkd = sig.parameters['pkd']
args = sig.parameters['args']
ko = sig.parameters['ko']
+ kod = sig.parameters['kod']
kwargs = sig.parameters['kwargs']
S((po, pk, args, ko, kwargs))
+ S((po, pk, ko, kod))
+ S((po, pod, ko))
+ S((po, pod, kod))
+ S((pod, ko, kod))
+ S((pod, kod))
+ S((pod, args, kod, kwargs))
+ # keyword-only parameters without default values
+ # can follow keyword-only parameters with default values:
+ S((kod, ko))
+ S((kod, ko, kwargs))
+ S((args, kod, ko))
with self.assertRaisesRegex(ValueError, 'wrong parameter order'):
S((pk, po, args, ko, kwargs))
@@ -2334,14 +2359,17 @@ class TestSignatureObject(unittest.TestCase):
S((pod, po))
with self.assertRaisesRegex(ValueError, 'follows default argument'):
+ S((pod, pk))
+
+ with self.assertRaisesRegex(ValueError, 'follows default argument'):
+ S((po, pod, pk))
+
+ with self.assertRaisesRegex(ValueError, 'follows default argument'):
S((po, pkd, pk))
with self.assertRaisesRegex(ValueError, 'follows default argument'):
S((pkd, pk))
- self.assertTrue(repr(sig).startswith('<Signature'))
- self.assertTrue('(po, pk' in repr(sig))
-
def test_signature_object_pickle(self):
def foo(a, b, *, c:1={}, **kw) -> {42:'ham'}: pass
foo_partial = functools.partial(foo, a=1)