cython
1from cython.cimports.cpython.version import PY_MAJOR_VERSION2
3@cython.cfunc4def _text(s) -> str:5if type(s) is str:6# Fast path for most common case(s).7return cython.cast(str, s)8
9elif PY_MAJOR_VERSION < 3 and isinstance(s, bytes):10# Only accept byte strings as text input in Python 2.x, not in Py3.11return cython.cast(bytes, s).decode('ascii')12
13elif isinstance(s, str):14# We know from the fast path above that 's' can only be a subtype here.15# An evil cast to <str> might still work in some(!) cases,16# depending on what the further processing does. To be safe,17# we can always create a copy instead.18return str(s)19
20else:21raise TypeError("Could not convert to str.")22