{"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":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"pandas/core/arrays/arrow/array.py","lineNumber":3749,"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":3731,"sourceCodeEnd":3767,"githubUrl":"https://github.com/pandas-dev/pandas/blob/71959b8cb9b2459c16e14b34f28b178ccfe14735/pandas/core/arrays/arrow/array.py#L3731-L3767","documentation":"Raised by ArrowExtensionArray._str_rsplit when `pat` is not None and is not a Python str (e.g. bytes, an int, or a numpy scalar). The PyArrow split functions require a string pattern, so any non-str separator is rejected with TypeError before being forwarded to pc.split_pattern. Reached via Series.str.rsplit on a pyarrow-string Series.","triggerScenarios":"Calling `s.str.rsplit(separator)` where `separator` is bytes (`b\",\"`), a numpy str_, an int, or None mishandled. Mixing up positional args so a non-str value lands in the `pat` slot also triggers it.","commonSituations":"Data pipelines that split on bytes read from binary protocols; config-driven separators loaded from JSON/YAML that come back as non-str; passing `n` into the `pat` position by mistake.","solutions":["Pass a str separator: `s.str.rsplit(\",\", n=1)`.","Decode bytes first: `sep.decode() if isinstance(sep, bytes) else sep`.","Coerce loaded config values: `str(sep)` before calling rsplit.","Double-check argument order: signature is `.str.rsplit(pat=None, n=-1)`."],"exampleFix":"# before\ns = pd.Series([\"a,b,c\"], dtype=\"string[pyarrow]\")\ns.str.rsplit(b\",\")  # TypeError: expected a string object, not bytes\n\n# after\ns.str.rsplit(\",\")","handlingStrategy":"type-guard","validationCode":"def safe_rsplit(s, pat=None, n=-1):\n    if pat is not None and not isinstance(pat, str):\n        raise TypeError(f\"pat must be str or None, got {type(pat).__name__}\")\n    return s.str.rsplit(pat, n=n)","typeGuard":"def is_str_or_none(v) -> bool:\n    return v is None or isinstance(v, str)","tryCatchPattern":"try:\n    out = s.str.rsplit(pat, n=n)\nexcept TypeError as e:\n    if \"expected a string object\" in str(e):\n        out = s.str.rsplit(str(pat) if pat is not None else None, n=n)\n    else:\n        raise","preventionTips":["Normalize separators to str at config-load time.","Add type annotations to helper functions that wrap str.rsplit.","Beware bytes separators from binary protocols; decode before splitting."],"tags":["pyarrow","string-accessor","type-error"],"analyzedSha":"71959b8cb9b2459c16e14b34f28b178ccfe14735","analyzedAt":"2026-08-07T01:30:20.476Z","schemaVersion":2},"datasetVersion":"2026-08-07T03:17:09.362Z"}