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

  1. Delete the old parameter name from the call and keep only the new one
  2. Audit wrapper functions that forward **kwargs alongside explicit keyword arguments
  3. 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

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


AI-assisted analysis of pola-rs/polars@5d8ebabf11 (2026-08-28). Data as JSON: /api/errors/4c59d6a9c629afdf. Report an issue: GitHub.