pola-rs/polars · error · ArgumentRemovedError
{func_name!r} received both {param.name!r} and {param.new_na
Error message
{func_name!r} received both {param.name!r} and {param.new_name!r} as arguments; {param.name!r}{was_deprecated_and} has been renamed to {param.new_name!r} in version {param.removed_in}. What it means
Raised by polars' removed-parameter decorator when a function call passes BOTH the old, removed parameter name and its new name simultaneously. Passing both is ambiguous, so polars raises ArgumentRemovedError explaining the rename and the version it took effect.
Source
Thrown at py-polars/src/polars/_utils/expired.py:143
def _raise_removed_argument_error(
param: RemovedParameter | RenamedParameter,
*,
func_name: str,
kwargs: dict[str, object],
) -> NoReturn:
was_deprecated_and = (
f" was deprecated in version {param.deprecated_in} and"
if param.deprecated_in is not None
else ""
)
if isinstance(param, RenamedParameter):
if param.name in kwargs and param.new_name in kwargs:
msg = (
f"{func_name!r} received both {param.name!r} and {param.new_name!r} as arguments;"
f" {param.name!r}{was_deprecated_and} has been renamed to"
f" {param.new_name!r} in version {param.removed_in}."
)
raise ArgumentRemovedError(msg)
else:
msg = (
f"the argument {param.name!r} for {func_name!r}{was_deprecated_and}"
f" has been removed in version {param.removed_in}."
f" It was renamed to {param.new_name!r}."
)
msg = msg if param.hint is None else f"{msg} {param.hint}"
raise ArgumentRemovedError(msg)
elif isinstance(param, RemovedParameter):
msg = (
f"the argument {param.name!r} for {func_name!r}{was_deprecated_and}"
f" has been removed in version {param.removed_in}."
)
msg = msg if param.hint is None else f"{msg} {param.hint}"
raise ArgumentRemovedError(msg)
else:
msg = f"Unexpected parameter type: {type(param)!r}"
raise TypeError(msg)View on GitHub (pinned to 5d8ebabf11)
Solutions
- Delete the old parameter name from the call and keep only the new one
- Audit wrapper functions that forward **kwargs alongside explicit keyword arguments
- Grep the codebase for the old parameter name to catch other call sites
Example fix
# before
df.rolling_mean('a', window_size=3, min_periods=2, min_samples=2)
# after
df.rolling_mean('a', window_size=3, min_samples=2) Defensive patterns
Strategy: validation
Validate before calling
old, new = 'min_periods', 'min_samples'
if old in kwargs and new in kwargs:
kwargs.pop(old) # or raise in your own wrapper Try / catch
try:
fn(**kwargs)
except Exception as e:
if 'received both' in str(e):
kwargs.pop('min_periods', None)
return fn(**kwargs)
raise Prevention
- Never forward **kwargs together with explicit renamed kwargs
- Lint for known removed parameter names
- Clean up old names immediately after a rename
When it happens
Trigger: Calling a decorated polars function (e.g. rolling_* functions after min_periods was renamed to min_samples) with both kwargs at once: df.rolling_mean('a', min_periods=2, min_samples=2).
Common situations: Copy-pasted calls that append the new parameter while leaving the old one in place; merge conflicts during migration; wrapper functions forwarding **kwargs plus an explicit new argument.
Related errors
- `{name}` was removed in version {version}
- the argument {param.name!r} for {func_name!r}{was_deprecated
- the argument {param.name!r} for {func_name!r}{was_deprecated
- `strict=False` is no longer supported for `how='horizontal'`
- the `dtypes` parameter for `read_csv` has been renamed to `s
AI-assisted analysis of pola-rs/polars@5d8ebabf11 (2026-08-28).
Data as JSON: /api/errors/4c59d6a9c629afdf.
Report an issue: GitHub.