]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-39957: Change Signature.parameters to OrderedDict (GH-18988)
authorJens Reidel <jens@troet.org>
Wed, 18 Mar 2020 02:22:46 +0000 (03:22 +0100)
committerGitHub <noreply@github.com>
Wed, 18 Mar 2020 02:22:46 +0000 (11:22 +0900)
Lib/inspect.py
Lib/test/test_inspect.py

index 125bd456a1c46f4020bb96d7c58fc48a0f7107a0..90435a10caac77a2a9118814086c60918613f8a1 100644 (file)
@@ -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,10 +2763,10 @@ class Signature:
         """
 
         if parameters is None:
-            params = {}
+            params = OrderedDict()
         else:
             if __validate_parameters__:
-                params = {}
+                params = OrderedDict()
                 top_kind = _POSITIONAL_ONLY
                 kind_defaults = False
 
@@ -2805,7 +2805,7 @@ class Signature:
 
                     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
index 8a2efc879323fb7794f70aa418ae0318d77fa2c3..f193807e80473ad3c8c0089980df9d2ffc092717 100644 (file)
@@ -2077,7 +2077,7 @@ class TestSignatureObject(unittest.TestCase):
         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
@@ -3181,6 +3181,11 @@ class TestSignatureObject(unittest.TestCase):
         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):