Skip to content

inspect.signature(map) works in Python 3.13, but gives a signature that looks like only one arg is required #120526

Closed
@AdamWill

Description

@AdamWill

Bug report

Bug description:

>>> list(inspect.signature(map).parameters.values())[0].kind
<_ParameterKind.POSITIONAL_ONLY: 0>
>>> list(inspect.signature(map).parameters.values())[1].kind
<_ParameterKind.VAR_POSITIONAL: 2>

Up to Python 3.12, inspect.signature(map) just doesn't work, it raises ValueError. In 3.13, it works, but the signature you get seems like kind of a lie. The toolz library has this code to work out how many arguments a function requires:

    return sum(1 for p in sigspec.parameters.values()
               if p.default is p.empty
               and p.kind in (p.POSITIONAL_OR_KEYWORD, p.POSITIONAL_ONLY))

where sigspec is the result of inspect.signature(function). That code seems sensible to me. But it gives the wrong answer for map, because the signature returned by inspect.signature(map) says the "kind" of the second arg (iterables) is VAR_POSITIONAL, which the docs say "corresponds to a *args parameter in a Python function definition". That does make it seem optional, because of course if you define a function like myfunc(*args), it does not require any arguments. But really, for map, you have to provide at least one iterable, or you get the error "map() must have at least two arguments." from https://github.com/python/cpython/blob/b2e71ff4f8fa5b7d8117dd8125137aee3d01f015/Python/bltinmodule.c#L1322C12-L1322C53 .

It kinda seems to me like maybe the signature of map should show three args, the first one POSITIONAL_ONLY, the second (iterable) POSITIONAL_OR_KEYWORD, and the third (*iterables) VAR_POSITIONAL? This is how it looks in the docs.

toolz can work around this by special-casing map one way or another, but it seemed worth at least reporting upstream.

CPython versions tested on:

3.12, 3.13

Operating systems tested on:

Linux

Linked PRs

Metadata

Metadata

Assignees

No one assigned

    Labels

    type-bugAn unexpected behavior, bug, or error

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions