summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorInada Naoki <songofacandy@gmail.com>2020-03-02 09:54:49 (GMT)
committerGitHub <noreply@github.com>2020-03-02 09:54:48 (GMT)
commit211055176157545ce98e6c02b09d624719e6dd30 (patch)
treea5727a736333dd62017bfcaa5ed57b6c1f2336eb
parent9f1cb1bb49476246de5d9ed5fe680301cf7f7571 (diff)
downloadcpython-211055176157545ce98e6c02b09d624719e6dd30.zip
cpython-211055176157545ce98e6c02b09d624719e6dd30.tar.gz
cpython-211055176157545ce98e6c02b09d624719e6dd30.tar.bz2
bpo-39775: inspect: Change Signature.parameters back to OrderedDict. (GH-18684)
-rw-r--r--Doc/library/inspect.rst11
-rw-r--r--Doc/whatsnew/3.9.rst6
-rw-r--r--Lib/inspect.py22
-rw-r--r--Misc/NEWS.d/next/Library/2020-02-28-16-42-16.bpo-39775.IuSvVb.rst2
4 files changed, 24 insertions, 17 deletions
diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst
index 9b9bc99..d00a30f 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 3364f39..f49575d 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 950bdb2..bb82f96 100644
--- a/Lib/inspect.py
+++ b/Lib/inspect.py
@@ -48,7 +48,7 @@ import warnings
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 0000000..1667b43
--- /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.