Repository navigation
Add support for multiple signatures #73536
Description
Activity
Some functions can be described by the single signature. See examples in msg285647. Selected examples:
dict.pop(key) dict.pop(key, default) type(obj) type(name, bases, mapping) range(stop) range(start, stop, step=1) min(iterable, *, key=identity) min(iterable, *, default, key=identity) min(*args, key=identity)
I think the only way to resolve this problem is to add the support of multiple signatures in inspect, pydoc, Argument Clinic, etc.
- added3.7 (EOL)end of lifeend of lifestdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directorytype-featureA feature request or enhancementA feature request or enhancement
on Jan 23, 2017 Signature object provides methods like .bind(), which will be hard to define if a function has many signatures. Also, inspect.signature currently returns one Signature object, that shouldn't be changed.
Wouldn't it be easier instead of this:
type(obj)
type(name, bases, mapping)do this:
type(obj_or_name, bases=None, mapping=None)And explain what really is going on in the docstring?
It can be do, but I don't think it is worth. Making bases and mapping optional arguments does not make much sense to me. And there is no a value that can be used as a default value for the second parameter in dict.pop().
#117671 is a draft implementation. It adds MultiSignature, which is a subclass of Signature, but supports iteration and has length.
inspect.signatures()always returns a MultiSignature, even if it contains a single signature.inspect.signature()can also return a MultiSignature.pydocand all other stdlib code was updated to support multisignatures. All builtin functions and methods of builtin classes excepttype()andsuper()has now signatures, i.e. are supported byinspect.signature()andinspect.signatures().>>> import inspect >>> inspect.signature(range) <MultiSignature (stop, /)|(start, stop, step=1, /)> >>> print(inspect.signature(range)) (stop, /) (start, stop, step=1, /) >>> >>> inspect.signature(dict.pop) <MultiSignature (self, key, /)|(self, key, default, /)> >>> print(inspect.signature(dict.pop)) (self, key, /) (self, key, default, /) >>> >>> inspect.signature(min) <MultiSignature (iterable, /, *, key=None)|(iterable, /, *, default, key=None)|(arg1, arg2, /, *args, key=None)> >>> print(inspect.signature(min)) (iterable, /, *, key=None) (iterable, /, *, default, key=None) (arg1, arg2, /, *args, key=None)
MultiSignature's attribute
parametersis a union of all parameters in all subsignatures, andreturn_annotationis a union of return annotations of subsignatures.bind()andbind_partial()are supported, butreplace()does not.Future features:
- Union and itersection of Signature and MultiSignature objects. An intersection will be useful to find the common signature for
__new__and__init__methods (one of them can contain*args, **kwargs). - Partial signature. Like
bind_partial(), but instead of a BoundArguments object it should return a new (multi-)signature object after binding arguments. It will help to get the signature of bound and class methods,partialandpartialmethodobjects. - Generate multi-signatures in Argument Clinic if default values are not representable.
- Generate multi-signatures in Argument Clinic for optional groups.
- Support multi-signatures in
functools.singledispatchandtyping.override().
Reacted by Erlend E. Aasland, Sergey B Kirpichev and Kirill Podoprigora- Union and itersection of Signature and MultiSignature objects. An intersection will be useful to find the common signature for
IMO, this should be a PEP.
It's an exciting improvement, and it has a wide reach -- areas like typing, dynamic dispatch, or documentation will all be affected.Reacted by Stan Ulbrych- changed the title
[-]Add support of multiple signatures[/-][+]Add support for multiple signatures[/+]on Apr 4, 2025 - marked The docstring of
dict()should match the doc ofdict()and it should be more understandable #137629 as a duplicate of this issueon Sep 2, 2025
Metadata
Metadata
Assignees
Labels
Projects
- StatusShow more project fieldsNo status
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
Linked PRs