{"record":{"id":"a33828c023fae9c9","repo":"pathwaycom/pathway","slug":"left-instance-and-right-instance-arguments-to","errorCode":null,"errorMessage":"`left_instance` and `right_instance` arguments to join should always be provided simultaneously","messagePattern":"`left_instance` and `right_instance` arguments to join should always be provided simultaneously","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/pathway/internals/arg_handlers.py","lineNumber":126,"sourceCode":"            elif isinstance(id, str):\n                raise ValueError(\n                    \"Received `id` argument of join that is a string.\\n\"\n                    + f\"Did you mean <table>.{id}\"\n                    + f\" instead of {repr(id)}?\"\n                )\n            elif not isinstance(id, expr.ColumnReference):\n                raise ValueError(\n                    \"The id argument of a join has to be a ColumnReference.\"\n                )\n\n        if \"defaults\" in kwargs:\n            processed_kwargs[\"defaults\"] = kwargs.pop(\"defaults\")\n\n        if \"left_instance\" in kwargs and \"right_instance\" in kwargs:\n            processed_kwargs[\"left_instance\"] = kwargs.pop(\"left_instance\")\n            processed_kwargs[\"right_instance\"] = kwargs.pop(\"right_instance\")\n        elif \"left_instance\" in kwargs or \"right_instance\" in kwargs:\n            raise ValueError(\n                \"`left_instance` and `right_instance` arguments to join \"\n                + \"should always be provided simultaneously\"\n            )\n\n        if \"direction\" in kwargs:\n            direction = processed_kwargs[\"direction\"] = kwargs.pop(\"direction\")\n            from pathway.stdlib.temporal import Direction\n\n            if isinstance(direction, str):\n                raise ValueError(\n                    \"Received `direction` argument of join that is a string.\\n\"\n                    + \"You probably want to use one of \"\n                    + \"Direction.BACKWARD, Direction.FORWARD or Direction.NEAREST values.\"\n                )\n            if not isinstance(direction, Direction):\n                raise ValueError(\n                    \"direction argument of join should be of type asof_join.Direction.\"\n                )","sourceCodeStart":108,"sourceCodeEnd":144,"githubUrl":"https://github.com/pathwaycom/pathway/blob/fa2f74a4649b7c5908690cf60137263d8d80de5f/python/pathway/internals/arg_handlers.py#L108-L144","documentation":"The 'direction' kwarg of asof-style joins must be a pathway.stdlib.temporal.Direction enum (BACKWARD, FORWARD, NEAREST), not a string. Passing direction='backward' triggers this ValueError in the shared join kwargs handler, which imports Direction locally and isinstance-checks the value; the string case gets its own message listing the valid enum members.","triggerScenarios":"io.asof_join(left, right, ..., direction='backward'); direction read from config as a string; porting pandas merge_asof(direction='backward') calls unchanged.","commonSituations":"pandas merge_asof habits; join direction supplied by CLI/config; older snippets predating the enum requirement.","solutions":["Use the enum: direction=pw.stdlib.temporal.Direction.BACKWARD (or FORWARD/NEAREST).","Map config strings once: {'backward': Direction.BACKWARD, ...}[cfg['direction']].","Remember BACKWARD is the default for asof joins if you can omit the argument."],"exampleFix":"# before\npw.io.asof_join(left, right, left.time == right.time, direction=\"backward\")\n\n# after\nfrom pathway.stdlib.temporal import Direction\npw.io.asof_join(left, right, left.time == right.time, direction=Direction.BACKWARD)","handlingStrategy":"type-guard","validationCode":"from pathway.stdlib.temporal import Direction\n\ndirection = {\n    \"backward\": Direction.BACKWARD,\n    \"forward\": Direction.FORWARD,\n    \"nearest\": Direction.NEAREST,\n}[cfg[\"asof_direction\"].lower()]","typeGuard":"from pathway.stdlib.temporal import Direction\n\ndef is_direction(v) -> bool:\n    return isinstance(v, Direction)","tryCatchPattern":null,"preventionTips":["Use Direction.BACKWARD/FORWARD/NEAREST instead of strings.","Map config strings to Direction members once at load time.","BACKWARD is the default for asof joins — omit direction when that is what you want."],"tags":["join","asof-join","enum","api-misuse"],"backgroundTag":null,"analyzedSha":"fa2f74a4649b7c5908690cf60137263d8d80de5f","analyzedAt":"2026-08-15T01:48:17.006Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}