Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion toolz/functoolz.py
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ def __signature__(self):
elif kind == param.VAR_POSITIONAL:
if kwonly:
continue
elif param.name in keywords:
elif param.name in keywords and kind != param.POSITIONAL_ONLY:
default = keywords[param.name]
kind = param.KEYWORD_ONLY
kwonly = True
Expand Down
30 changes: 30 additions & 0 deletions toolz/tests/test_functoolz.py
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,36 @@ def h(x, func=int):
assert curry(h, func=str)(0.0) == '0.0'


@pytest.mark.parametrize('kwargs', [{'a': 10}, {'b': 20}, {'a': 10, 'b': 20}])
def test_curry_signature_positional_only_keywords(kwargs):
def f(a=1, b=2, /, c=3, *args, **keywords):
return a, b, c, args, keywords

curried = curry(f, **kwargs)
signature = inspect.signature(curried)

assert signature == inspect.signature(f)
bound = signature.bind(4, 5, 6, 7)
assert curried(*bound.args, **bound.kwargs) == (4, 5, 6, (7,), kwargs)
assert curried() == (1, 2, 3, (), kwargs)


def test_curry_signature_positional_only_and_keyword_bound():
def f(a=1, /, b=2, *args, **kwargs):
return a, b, args, kwargs

curried = curry(f, a=10, b=20)
signature = inspect.signature(curried)

assert signature.parameters['a'].kind == inspect.Parameter.POSITIONAL_ONLY
assert signature.parameters['a'].default == 1
assert signature.parameters['b'].kind == inspect.Parameter.KEYWORD_ONLY
assert signature.parameters['b'].default == 20
assert 'args' not in signature.parameters
bound = signature.bind(3, b=4)
assert curried(*bound.args, **bound.kwargs) == (3, 4, (), {'a': 10})


def test_curry_passes_errors():
@curry
def f(a, b):
Expand Down