{"record":{"id":"42318e6ef6b9c806","repo":"pola-rs/polars","slug":"use-of-how-how-should-be-replaced-with-how-full","errorCode":null,"errorMessage":"use of `how='{how}'` should be replaced with `how='full'`.","messagePattern":"use of `how='(.+?)'` should be replaced with `how='full'`\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"py-polars/src/polars/lazyframe/frame.py","lineNumber":9033,"sourceCode":"        ... ).collect()\n        shape: (5, 2)\n        ┌─────┬──────┐\n        │ A   ┆ B    │\n        │ --- ┆ ---  │\n        │ i64 ┆ i64  │\n        ╞═════╪══════╡\n        │ 1   ┆ -99  │\n        │ 2   ┆ 500  │\n        │ 3   ┆ null │\n        │ 4   ┆ 700  │\n        │ 5   ┆ -66  │\n        └─────┴──────┘\n        \"\"\"\n        require_same_type(self, other)\n\n        if how in {\"outer\", \"outer_coalesce\"}:  # type: ignore[comparison-overlap]\n            msg = f\"use of `how='{how}'` should be replaced with `how='full'`.\"\n            raise ValueError(msg)\n\n        if how not in (\"left\", \"inner\", \"full\"):\n            msg = f\"`how` must be one of {{'left', 'inner', 'full'}}; found {how!r}\"\n            raise ValueError(msg)\n\n        row_index_name = None\n        if on is None:\n            if left_on is None and right_on is None:\n                # no keys provided--use row index\n                row_index_name = \"__POLARS_ROW_INDEX\"\n                self = self.with_row_index(row_index_name)\n                other = other.with_row_index(row_index_name)\n                left_on = right_on = [row_index_name]\n            else:\n                # one of left or right is missing, raise error\n                if left_on is None:\n                    msg = \"missing join columns for left frame\"\n                    raise ValueError(msg)","sourceCodeStart":9015,"sourceCodeEnd":9051,"githubUrl":"https://github.com/pola-rs/polars/blob/fe841f959ef4d2ceefc05a310d33ed7b1ab24e5e/py-polars/src/polars/lazyframe/frame.py#L9015-L9051","documentation":"Join-method guard catching both legacy outer strategies at once: how values 'outer' and 'outer_coalesce' were renamed. They now map to how='full' (with coalescing expressed via the coalesce parameter), so either old value fails the membership check against ('left', 'inner', 'full') and is rejected before the join is planned.","triggerScenarios":"Calling `lf.join(other, on=\"id\", how=\"outer\")` or `how=\"outer_coalesce\"` — the membership check raises immediately.","commonSituations":"Migrating from polars < 1.0 where 'outer' was valid; copying join examples from older documentation or Stack Overflow answers.","solutions":["Replace `how=\"outer\"` with `how=\"full\"`.","Replace `how=\"outer_coalesce\"` with `how=\"full\"` plus key coalescing if that behavior is desired.","Grep for `how=\"outer\"` across the codebase and update all call sites."],"exampleFix":"// before\nlf.join(other, on=\"id\", how=\"outer\")\n// after\nlf.join(other, on=\"id\", how=\"full\")","handlingStrategy":"validation","validationCode":"if how in {\"outer\", \"outer_coalesce\"}:\n    how = \"full\"\nif how not in (\"left\", \"inner\", \"full\"):\n    raise ValueError(f\"unsupported how={how!r}\")\nout = lf.join(other, on=\"id\", how=how)","typeGuard":null,"tryCatchPattern":"try:\n    out = lf.join(other, on=key, how=how)\nexcept ValueError as e:\n    if \"should be replaced with\" in str(e):\n        out = lf.join(other, on=key, how=\"full\")\n    else:\n        raise","preventionTips":["Use only 'left', 'inner', 'full' for this API.","Grep the codebase for how=\"outer\" and migrate.","Keep polars upgraded and read changelogs for renamed values."],"tags":["python","polars","join","deprecated","api-change"],"backgroundTag":"deprecated-api-usage","analyzedSha":"fe841f959ef4d2ceefc05a310d33ed7b1ab24e5e","analyzedAt":"2026-09-18T22:14:11.667Z","contentChangedAt":"2026-09-18T22:14:11.667Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}