Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
8fa303f
Initial plan
Copilot Jan 27, 2026
b46d5f8
Fix: Handle variadic arguments (*args, **kwargs) in cache key generation
Copilot Jan 27, 2026
08b9287
Address PR review feedback: keyword-only params, parametrize tests, s…
Copilot Jan 27, 2026
f85478b
Improve test assertions to explicitly verify cache hits
Copilot Jan 27, 2026
6c7cb01
Merge branch 'master' into copilot/fix-cachier-varadic-args-issue
Borda Jan 27, 2026
93cb73a
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jan 27, 2026
02da21d
Simplify parameter handling in `map_arguments`
Borda Jan 27, 2026
d708f77
Fix test assertion in test_varargs_memory_backend
Copilot Jan 27, 2026
5197b83
Merge branch 'copilot/fix-cachier-varadic-args-issue' of https://gith…
Borda Jan 27, 2026
610061a
Merge branch 'copilot/fix-cachier-varadic-args-issue' of https://gith…
Borda Jan 27, 2026
4b09f8b
Refactor and parametrize varargs/varkwargs test cases for enhanced re…
Borda Jan 27, 2026
ce825f4
Refactor and parametrize varargs/varkwargs test cases for enhanced re…
Borda Jan 27, 2026
00808aa
Remove redundant `@pytest.mark.pickle` annotations from varargs/varkw…
Borda Jan 27, 2026
46f23ec
Merge branch 'master' into copilot/fix-cachier-varadic-args-issue
Borda Jan 27, 2026
ba16e76
Merge branch 'master' into copilot/fix-cachier-varadic-args-issue
Borda Jan 27, 2026
6ffc7ec
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jan 27, 2026
79b47fd
Add comprehensive edge case tests for variadic arguments
Copilot Jan 28, 2026
ab76ca6
Simplify redundant conditional in _convert_args_kwargs
Copilot Jan 28, 2026
14860b4
linting
Borda Jan 28, 2026
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
55 changes: 47 additions & 8 deletions src/cachier/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,14 +75,53 @@ def _convert_args_kwargs(func, _is_method: bool, args: tuple, kwds: dict) -> dic
args = func.args + args
kwds.update({k: v for k, v in func.keywords.items() if k not in kwds})
func = func.func
func_params = list(inspect.signature(func).parameters)
args_as_kw = dict(zip(func_params[1:], args[1:]) if _is_method else zip(func_params, args))
# init with default values
kwargs = {
k: v.default for k, v in inspect.signature(func).parameters.items() if v.default is not inspect.Parameter.empty
}
# merge args expanded as kwargs and the original kwds
kwargs.update(dict(**args_as_kw, **kwds))

sig = inspect.signature(func)
func_params = list(sig.parameters)

# Separate regular parameters from VAR_POSITIONAL
regular_params = []
var_positional_name = None

for param_name in func_params:
param = sig.parameters[param_name]
if param.kind == inspect.Parameter.VAR_POSITIONAL:
var_positional_name = param_name
elif param.kind in (
inspect.Parameter.POSITIONAL_ONLY,
inspect.Parameter.POSITIONAL_OR_KEYWORD,
):
regular_params.append(param_name)

# Map positional arguments to regular parameters
if _is_method:
# Skip 'self' for methods
args_to_map = args[1:]
params_to_use = regular_params[1:]
else:
args_to_map = args
params_to_use = regular_params

# Map as many args as possible to regular parameters
num_regular = len(params_to_use)
args_as_kw = dict(zip(params_to_use, args_to_map[:num_regular]))

# Handle variadic positional arguments
# Store them with indexed keys like __varargs_0__, __varargs_1__, etc.
if var_positional_name and len(args_to_map) > num_regular:
var_args = args_to_map[num_regular:]
for i, arg in enumerate(var_args):
args_as_kw[f"__varargs_{i}__"] = arg

# Init with default values
kwargs = {k: v.default for k, v in sig.parameters.items() if v.default is not inspect.Parameter.empty}

# Merge args expanded as kwargs and the original kwds
kwargs.update(args_as_kw)

# Handle keyword arguments (including variadic keyword arguments)
kwargs.update(kwds)

return OrderedDict(sorted(kwargs.items()))


Expand Down
Loading
Loading