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

This commit is contained in:
Inada Naoki 2020-03-02 18:54:49 +09:00 committed by GitHub
parent 9f1cb1bb49
commit 2110551761
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 24 additions and 17 deletions

View File

@ -624,18 +624,15 @@ function.
.. attribute:: Signature.parameters .. attribute:: Signature.parameters
An dictionary of :class:`Parameter` objects. Parameters appear in strict An ordered mapping of parameters' names to the corresponding
definition order, including keyword-only parameters. :class:`Parameter` objects. Parameters appear in strict definition
order, including keyword-only parameters.
.. versionchanged:: 3.7 .. versionchanged:: 3.7
Python only explicitly guaranteed that it preserved the declaration Python only explicitly guaranteed that it preserved the declaration
order of keyword-only parameters as of version 3.7, although in practice order of keyword-only parameters as of version 3.7, although in practice
this order had always been preserved in Python 3. 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 .. attribute:: Signature.return_annotation
The "return" annotation for the callable. If the callable has no "return" The "return" annotation for the callable. If the callable has no "return"
@ -824,7 +821,7 @@ function.
.. attribute:: BoundArguments.arguments .. 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` Contains only explicitly bound arguments. Changes in :attr:`arguments`
will reflect in :attr:`args` and :attr:`kwargs`. will reflect in :attr:`args` and :attr:`kwargs`.

View File

@ -218,6 +218,12 @@ now raises :exc:`ImportError` instead of :exc:`ValueError` for invalid relative
import attempts. import attempts.
(Contributed by Ngalim Siregar in :issue:`37444`.) (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 ipaddress
--------- ---------

View File

@ -48,7 +48,7 @@ import warnings
import functools import functools
import builtins import builtins
from operator import attrgetter from operator import attrgetter
from collections import namedtuple from collections import namedtuple, OrderedDict
# Create constants for the compiler flags in Include/code.h # Create constants for the compiler flags in Include/code.h
# We try to get them from dis to avoid duplication # 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 old_params = wrapped_sig.parameters
new_params = {} new_params = OrderedDict(old_params.items())
partial_args = partial.args or () partial_args = partial.args or ()
partial_keywords = partial.keywords or {} partial_keywords = partial.keywords or {}
@ -1743,7 +1743,6 @@ def _signature_get_partial(wrapped_sig, partial, extra_args=()):
transform_to_kwonly = False transform_to_kwonly = False
kwonly_params = {} # Keyword only parameters are moved to end.
for param_name, param in old_params.items(): for param_name, param in old_params.items():
try: try:
arg_value = ba.arguments[param_name] 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 param.kind is _POSITIONAL_ONLY:
# If positional-only parameter is bound by partial, # If positional-only parameter is bound by partial,
# it effectively disappears from the signature # it effectively disappears from the signature
new_params.pop(param_name)
continue continue
if param.kind is _POSITIONAL_OR_KEYWORD: if param.kind is _POSITIONAL_OR_KEYWORD:
@ -1771,26 +1771,28 @@ def _signature_get_partial(wrapped_sig, partial, extra_args=()):
# multiple values. # multiple values.
transform_to_kwonly = True transform_to_kwonly = True
# Set the new default value # Set the new default value
param = param.replace(default=arg_value) new_params[param_name] = param.replace(default=arg_value)
else: else:
# was passed as a positional argument # was passed as a positional argument
new_params.pop(param.name)
continue continue
if param.kind is _KEYWORD_ONLY: if param.kind is _KEYWORD_ONLY:
# Set the new default value # Set the new default value
param = param.replace(default=arg_value) new_params[param_name] = param.replace(default=arg_value)
if transform_to_kwonly: if transform_to_kwonly:
assert param.kind is not _POSITIONAL_ONLY assert param.kind is not _POSITIONAL_ONLY
if param.kind is _POSITIONAL_OR_KEYWORD: 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): elif param.kind in (_KEYWORD_ONLY, _VAR_KEYWORD):
kwonly_params[param_name] = param new_params.move_to_end(param_name)
else: elif param.kind is _VAR_POSITIONAL:
new_params[param_name] = param new_params.pop(param.name)
new_params.update(kwonly_params)
return wrapped_sig.replace(parameters=new_params.values()) return wrapped_sig.replace(parameters=new_params.values())

View File

@ -0,0 +1,2 @@
Change ``inspect.Signature.parameters`` back to ``collections.OrderedDict``.
This was changed to ``dict`` in Python 3.9.0a4.