{"record":{"id":"d71f4e8cd2dabb0d","repo":"pandas-dev/pandas","slug":"expected-a-string-object-not-type-pat-name","errorCode":null,"errorMessage":"expected a string object, not {type(pat).__name__}","messagePattern":"expected a string object, not (.+?)","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"pandas/core/arrays/arrow/array.py","lineNumber":3777,"sourceCode":"        if n in {-1, 0}:\n            n = None\n        if pat is None:\n            split_func = pc.utf8_split_whitespace\n        elif regex is True:\n            split_func = functools.partial(pc.split_pattern_regex, pattern=pat)\n        elif regex is False:\n            split_func = functools.partial(pc.split_pattern, pattern=pat)\n        # GH#58321: regex is None — infer: single-char literal, multi-char regex\n        elif len(pat) == 1:\n            split_func = functools.partial(pc.split_pattern, pattern=pat)\n        else:\n            split_func = functools.partial(pc.split_pattern_regex, pattern=pat)\n        return self._from_pyarrow_array(split_func(self._pa_array, max_splits=n))\n\n    def _str_rsplit(self, pat: str | None = None, n: int | None = -1) -> Self:\n        if pat is not None and not isinstance(pat, str):\n            msg = f\"expected a string object, not {type(pat).__name__}\"\n            raise TypeError(msg)\n        if n in {-1, 0}:\n            n = None\n        if pat is None:\n            return self._from_pyarrow_array(\n                pc.utf8_split_whitespace(self._pa_array, max_splits=n, reverse=True)\n            )\n        return self._from_pyarrow_array(\n            pc.split_pattern(self._pa_array, pat, max_splits=n, reverse=True)\n        )\n\n    def _str_translate(self, table: dict[int, str]) -> Self:\n        predicate = lambda val: val.translate(table)\n        result = self._apply_elementwise(predicate)\n        return self._from_pyarrow_array(pa.chunked_array(result))\n\n    def _str_wrap(self, width: int, **kwargs) -> Self:\n        kwargs[\"width\"] = width\n        tw = textwrap.TextWrapper(**kwargs)","sourceCodeStart":3759,"sourceCodeEnd":3795,"githubUrl":"https://github.com/pandas-dev/pandas/blob/3b7651241d4da534b3559b60ef128e1c34f54116/pandas/core/arrays/arrow/array.py#L3759-L3795","documentation":"Raised by ArrowExtensionArray._str_rsplit when `pat` is supplied but is not a `str`. The arrow split path is dispatched to pyarrow.compute.split_pattern, which requires a literal string pattern; passing bytes, a list, None-as-other-type, or any non-string object is rejected up front with a TypeError naming the offending type.","triggerScenarios":"Calling `ser.str.rsplit(pat=b\",\")` (bytes), `pat=44` (int), or any non-string separator on a string[pyarrow] Series. Note `pat=None` (whitespace split) is allowed; the check only fires for non-None non-str values.","commonSituations":"Reusing a separator constant declared as bytes; data flowing in from a binary source; passing a compiled pattern object where a literal string is expected.","solutions":["Pass a literal str separator: decode bytes with `.decode()` first.","If you intended a regex/compiled-pattern split, note rsplit on the arrow path only supports literal patterns — supply the pattern as a str (still treated literally here)."],"exampleFix":"# before\nser.str.rsplit(pat=b\",\")\n# after\nser.str.rsplit(pat=\",\")","handlingStrategy":"type-guard","validationCode":"if pat is not None and not isinstance(pat, str):\n    raise TypeError(f\"pat must be str, got {type(pat).__name__}\")\nser.str.rsplit(pat=pat)","typeGuard":"def is_str_or_none(pat) -> bool:\n    return pat is None or isinstance(pat, str)","tryCatchPattern":"try:\n    out = ser.str.rsplit(pat=pat)\nexcept TypeError as e:\n    if \"expected a string object\" in str(e):\n        out = ser.str.rsplit(pat=str(pat))\n    else:\n        raise","preventionTips":["Decode bytes separators to str before splitting","Type-check dynamic separator inputs at the boundary"],"tags":["pyarrow","string-accessor","type-error","arrow-extension"],"backgroundTag":null,"analyzedSha":"3b7651241d4da534b3559b60ef128e1c34f54116","analyzedAt":"2026-08-11T22:10:44.015Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}