[Python-checkins] bpo-39775: inspect: Change Signature.parameters back to OrderedDict. (GH-18684)

Inada Naoki webhook-mailer at python.org
Mon Mar 2 04:54:53 EST 2020


https://github.com/python/cpython/commit/211055176157545ce98e6c02b09d624719e6dd30
commit: 211055176157545ce98e6c02b09d624719e6dd30
branch: master
author: Inada Naoki <songofacandy at gmail.com>
committer: GitHub <noreply at github.com>
date: 2020-03-02T18:54:48+09:00
summary:

bpo-39775: inspect: Change Signature.parameters back to OrderedDict. (GH-18684)

files:
A Misc/NEWS.d/next/Library/2020-02-28-16-42-16.bpo-39775.IuSvVb.rst
M Doc/library/inspect.rst
M Doc/whatsnew/3.9.rst
M Lib/inspect.py

diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst
index 9b9bc99f43d48..d00a30ff00406 100644
--- a/Doc/library/inspect.rst
+++ b/Doc/library/inspect.rst
@@ -624,18 +624,15 @@ function.
 
    .. attribute:: Signature.parameters
 
-      An dictionary of :class:`Parameter` objects.  Parameters appear in strict
-      definition order, including keyword-only parameters.
+      An ordered mapping of parameters' names to the corresponding
+      :class:`Parameter` objects.  Parameters appear in strict definition
+      order, including keyword-only parameters.
 
       .. versionchanged:: 3.7
          Python only explicitly guaranteed that it preserved the declaration
          order of keyword-only parameters as of version 3.7, although in practice
          this order had always been preserved in Python 3.
 
-      .. versionchanged:: 3.9
-         :attr:`parameters` is now of type :class:`dict`. Formerly, it was of
-         type :class:`collections.OrderedDict`.
-
    .. attribute:: Signature.return_annotation
 
       The "return" annotation for the callable.  If the callable has no "return"
@@ -824,7 +821,7 @@ function.
 
    .. attribute:: BoundArguments.arguments
 
-      An ordered, mutable mapping of parameters' names to arguments' values.
+      A mutable mapping of parameters' names to arguments' values.
       Contains only explicitly bound arguments.  Changes in :attr:`arguments`
       will reflect in :attr:`args` and :attr:`kwargs`.
 
diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst
index 3364f392f15c7..f49575d89da67 100644
--- a/Doc/whatsnew/3.9.rst
+++ b/Doc/whatsnew/3.9.rst
@@ -218,6 +218,12 @@ now raises :exc:`ImportError` instead of :exc:`ValueError` for invalid relative
 import attempts.
 (Contributed by Ngalim Siregar in :issue:`37444`.)
 
+inspect
+-------
+
+:attr:`inspect.BoundArguments.arguments` is changed from ``OrderedDict`` to regular
+dict.  (Contributed by Inada Naoki in :issue:`36350` and :issue:`39775`.)
+
 ipaddress
 ---------
 
diff --git a/Lib/inspect.py b/Lib/inspect.py
index 950bdb221798d..bb82f96fdf374 100644
--- a/Lib/inspect.py
+++ b/Lib/inspect.py
@@ -48,7 +48,7 @@
 import functools
 import builtins
 from operator import attrgetter
-from collections import namedtuple
+from collections import namedtuple, OrderedDict
 
 # Create constants for the compiler flags in Include/code.h
 # We try to get them from dis to avoid duplication
@@ -1727,7 +1727,7 @@ def _signature_get_partial(wrapped_sig, partial, extra_args=()):
     """
 
     old_params = wrapped_sig.parameters
-    new_params = {}
+    new_params = OrderedDict(old_params.items())
 
     partial_args = partial.args or ()
     partial_keywords = partial.keywords or {}
@@ -1743,7 +1743,6 @@ def _signature_get_partial(wrapped_sig, partial, extra_args=()):
 
 
     transform_to_kwonly = False
-    kwonly_params = {}  # Keyword only parameters are moved to end.
     for param_name, param in old_params.items():
         try:
             arg_value = ba.arguments[param_name]
@@ -1753,6 +1752,7 @@ def _signature_get_partial(wrapped_sig, partial, extra_args=()):
             if param.kind is _POSITIONAL_ONLY:
                 # If positional-only parameter is bound by partial,
                 # it effectively disappears from the signature
+                new_params.pop(param_name)
                 continue
 
             if param.kind is _POSITIONAL_OR_KEYWORD:
@@ -1771,26 +1771,28 @@ def _signature_get_partial(wrapped_sig, partial, extra_args=()):
                     # multiple values.
                     transform_to_kwonly = True
                     # Set the new default value
-                    param = param.replace(default=arg_value)
+                    new_params[param_name] = param.replace(default=arg_value)
                 else:
                     # was passed as a positional argument
+                    new_params.pop(param.name)
                     continue
 
             if param.kind is _KEYWORD_ONLY:
                 # Set the new default value
-                param = param.replace(default=arg_value)
+                new_params[param_name] = param.replace(default=arg_value)
 
         if transform_to_kwonly:
             assert param.kind is not _POSITIONAL_ONLY
 
             if param.kind is _POSITIONAL_OR_KEYWORD:
-                kwonly_params[param_name] = param.replace(kind=_KEYWORD_ONLY)
+                new_param = new_params[param_name].replace(kind=_KEYWORD_ONLY)
+                new_params[param_name] = new_param
+                new_params.move_to_end(param_name)
             elif param.kind in (_KEYWORD_ONLY, _VAR_KEYWORD):
-                kwonly_params[param_name] = param
-        else:
-            new_params[param_name] = param
+                new_params.move_to_end(param_name)
+            elif param.kind is _VAR_POSITIONAL:
+                new_params.pop(param.name)
 
-    new_params.update(kwonly_params)
     return wrapped_sig.replace(parameters=new_params.values())
 
 
diff --git a/Misc/NEWS.d/next/Library/2020-02-28-16-42-16.bpo-39775.IuSvVb.rst b/Misc/NEWS.d/next/Library/2020-02-28-16-42-16.bpo-39775.IuSvVb.rst
new file mode 100644
index 0000000000000..1667b43a902fe
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2020-02-28-16-42-16.bpo-39775.IuSvVb.rst
@@ -0,0 +1,2 @@
+Change ``inspect.Signature.parameters`` back to ``collections.OrderedDict``.
+This was changed to ``dict`` in Python 3.9.0a4.



More information about the Python-checkins mailing list