From 9dfc8a182d4310e9382a23faa89497940b51fdb7 Mon Sep 17 00:00:00 2001 From: Jens Reidel Date: Sat, 14 Mar 2020 02:33:27 -0700 Subject: [PATCH 1/6] bpo-39957: Change inspect.Signature.parameters back to OrderedDict --- Lib/inspect.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Lib/inspect.py b/Lib/inspect.py index 125bd456a1c46f..834b6b9270f826 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -2733,7 +2733,7 @@ class Signature: A Signature object has the following public attributes and methods: - * parameters : dict + * parameters : OrderedDict An ordered mapping of parameters' names to the corresponding Parameter objects (keyword-only arguments are in the same order as listed in `code.co_varnames`). @@ -2763,14 +2763,14 @@ def __init__(self, parameters=None, *, return_annotation=_empty, """ if parameters is None: - params = {} + params = OrderedDict() else: if __validate_parameters__: - params = {} + params = OrderedDict() top_kind = _POSITIONAL_ONLY kind_defaults = False - for param in parameters: + for idx, param in enumerate(parameters): kind = param.kind name = param.name @@ -2805,7 +2805,8 @@ def __init__(self, parameters=None, *, return_annotation=_empty, params[name] = param else: - params = {param.name: param for param in parameters} + params = OrderedDict(((param.name, param) + for param in parameters)) self._parameters = types.MappingProxyType(params) self._return_annotation = return_annotation From 185530b2d2b8aeec08d0d938caca4f722d06bb20 Mon Sep 17 00:00:00 2001 From: Jens Reidel Date: Sat, 14 Mar 2020 02:48:54 -0700 Subject: [PATCH 2/6] Adjust tests to pass --- Lib/test/test_inspect.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index 8a2efc879323fb..8aa9b31d5dc27e 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -2077,7 +2077,7 @@ def test_signature_object(self): P = inspect.Parameter self.assertEqual(str(S()), '()') - self.assertEqual(repr(S().parameters), 'mappingproxy({})') + self.assertEqual(repr(S().parameters), 'mappingproxy(OrderedDict())') def test(po, pk, pod=42, pkd=100, *args, ko, **kwargs): pass From bdcb0c7364e3c25628f104e630c167f81e7ef268 Mon Sep 17 00:00:00 2001 From: "blurb-it[bot]" <43283697+blurb-it[bot]@users.noreply.github.com> Date: Sat, 14 Mar 2020 10:20:16 +0000 Subject: [PATCH 3/6] =?UTF-8?q?=F0=9F=93=9C=F0=9F=A4=96=20Added=20by=20blu?= =?UTF-8?q?rb=5Fit.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../next/Library/2020-03-14-10-20-14.bpo-39957.Dyj0Lj.rst | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2020-03-14-10-20-14.bpo-39957.Dyj0Lj.rst diff --git a/Misc/NEWS.d/next/Library/2020-03-14-10-20-14.bpo-39957.Dyj0Lj.rst b/Misc/NEWS.d/next/Library/2020-03-14-10-20-14.bpo-39957.Dyj0Lj.rst new file mode 100644 index 00000000000000..84f2eacd99b32a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-03-14-10-20-14.bpo-39957.Dyj0Lj.rst @@ -0,0 +1,2 @@ +Change ``inspect.Signature.parameters`` to ``collections.OrderedDict``. +A non-working fix was provided in bpo-39775. \ No newline at end of file From e97ab94b3ae1e5c2f611a8902a57fbced1b09dee Mon Sep 17 00:00:00 2001 From: Jens Reidel Date: Sat, 14 Mar 2020 05:57:40 -0700 Subject: [PATCH 4/6] Remove unneeded parens and enumerate call --- Lib/inspect.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Lib/inspect.py b/Lib/inspect.py index 834b6b9270f826..90435a10caac77 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -2770,7 +2770,7 @@ def __init__(self, parameters=None, *, return_annotation=_empty, top_kind = _POSITIONAL_ONLY kind_defaults = False - for idx, param in enumerate(parameters): + for param in parameters: kind = param.kind name = param.name @@ -2805,8 +2805,7 @@ def __init__(self, parameters=None, *, return_annotation=_empty, params[name] = param else: - params = OrderedDict(((param.name, param) - for param in parameters)) + params = OrderedDict((param.name, param) for param in parameters) self._parameters = types.MappingProxyType(params) self._return_annotation = return_annotation From 5fdcb444bab734529dbae971b7f9cf29efa47bd1 Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Wed, 18 Mar 2020 10:48:20 +0900 Subject: [PATCH 5/6] Delete 2020-03-14-10-20-14.bpo-39957.Dyj0Lj.rst --- .../next/Library/2020-03-14-10-20-14.bpo-39957.Dyj0Lj.rst | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 Misc/NEWS.d/next/Library/2020-03-14-10-20-14.bpo-39957.Dyj0Lj.rst diff --git a/Misc/NEWS.d/next/Library/2020-03-14-10-20-14.bpo-39957.Dyj0Lj.rst b/Misc/NEWS.d/next/Library/2020-03-14-10-20-14.bpo-39957.Dyj0Lj.rst deleted file mode 100644 index 84f2eacd99b32a..00000000000000 --- a/Misc/NEWS.d/next/Library/2020-03-14-10-20-14.bpo-39957.Dyj0Lj.rst +++ /dev/null @@ -1,2 +0,0 @@ -Change ``inspect.Signature.parameters`` to ``collections.OrderedDict``. -A non-working fix was provided in bpo-39775. \ No newline at end of file From 8da0e173ebc1a13255a35b2e7a80e0f9aa400976 Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Wed, 18 Mar 2020 10:49:08 +0900 Subject: [PATCH 6/6] Add test --- Lib/test/test_inspect.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index 8aa9b31d5dc27e..f193807e80473a 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -3181,6 +3181,11 @@ def test_signature_definition_order_preserved_on_kwonly(self): l = list(signature.parameters) self.assertEqual(l, unsorted_keyword_only_parameters) + def test_signater_parameters_is_ordered(self): + p1 = inspect.signature(lambda x, y: None).parameters + p2 = inspect.signature(lambda y, x: None).parameters + self.assertNotEqual(p1, p2) + class TestParameterObject(unittest.TestCase): def test_signature_parameter_kinds(self):