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
Bug report
Bug description:
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