{"record":{"id":"7c5d99a96e641479","repo":"pola-rs/polars","slug":"enum-categories-must-be-strings-enum-type-name","errorCode":null,"errorMessage":"Enum categories must be strings; `{enum_type_name}` values are integers","messagePattern":"Enum categories must be strings; `(.+?)` values are integers","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"py-polars/src/polars/datatypes/classes.py","lineNumber":1014,"sourceCode":"    >>> pl.Enum([\"north\", \"south\", \"east\", \"west\"])\n    Enum(categories=['north', 'south', 'east', 'west'])\n\n    Initialise from an existing Python enumeration:\n\n    >>> from http import HTTPMethod\n    >>> pl.Enum(HTTPMethod)\n    Enum(categories=['CONNECT', 'DELETE', 'GET', 'HEAD', 'OPTIONS', 'PATCH', 'POST', 'PUT', 'TRACE'])\n    \"\"\"  # noqa: W505\n\n    categories: Series\n\n    def __init__(self, categories: Series | Iterable[str] | type[enum.Enum]) -> None:\n        if isclass(categories) and issubclass(categories, enum.Enum):\n            for enum_subclass in (enum.Flag, enum.IntEnum):\n                if issubclass(categories, enum_subclass):\n                    enum_type_name = categories.__name__\n                    msg = f\"Enum categories must be strings; `{enum_type_name}` values are integers\"\n                    raise TypeError(msg)\n\n            enum_values = [\n                getattr(v, \"value\", v) for v in categories.__members__.values()\n            ]\n            categories = pl.Series(values=enum_values)\n        elif not isinstance(categories, pl.Series):\n            categories = pl.Series(values=categories)\n\n        if categories.is_empty():\n            self.categories = pl.Series(name=\"category\", dtype=String)\n            return\n\n        if categories.has_nulls():\n            msg = \"Enum categories must not contain null values\"\n            raise TypeError(msg)\n\n        if (dtype := categories.dtype) != String:\n            msg = f\"Enum categories must be strings; found data of type {dtype}\"","sourceCodeStart":996,"sourceCodeEnd":1032,"githubUrl":"https://github.com/pola-rs/polars/blob/fe841f959ef4d2ceefc05a310d33ed7b1ab24e5e/py-polars/src/polars/datatypes/classes.py#L996-L1032","documentation":"pl.Enum can be constructed from a Python enum.Enum class, but only if all values are strings. Flag and IntEnum subclasses have integer values, which cannot back a string Enum, so a TypeError naming the offending enum class is raised.","triggerScenarios":"pl.Enum(MyIntEnum) where MyIntEnum subclasses enum.IntEnum; pl.Enum(MyFlags) where MyFlags subclasses enum.Flag; pl.Enum of an enum inheriting IntFlag.","commonSituations":"Reusing existing application enums (status codes, permissions) defined as IntEnum directly as Polars Enum categories.","solutions":["Define a separate str-based enum (class inherits from str, enum.Enum) for Polars categories","Pass the string values explicitly as a list or Series instead of the enum class","Convert values with [str(v.value) for v in MyEnum] and pass that list"],"exampleFix":"// before\nclass Color(enum.IntEnum):\n    RED = 1\npl.Enum(Color)\n// after\nclass Color(str, enum.Enum):\n    RED = 'red'\npl.Enum(Color)","handlingStrategy":"validation","validationCode":"import enum, inspect\nif inspect.isclass(categories) and issubclass(categories, enum.Enum):\n    if issubclass(categories, (enum.Flag, enum.IntEnum)):\n        raise TypeError('use a str-based enum for pl.Enum categories')","typeGuard":"def is_str_enum(cls) -> bool:\n    return inspect.isclass(cls) and issubclass(cls, enum.Enum) \\\n        and not issubclass(cls, (enum.IntEnum, enum.Flag)) \\\n        and all(isinstance(v.value, str) for v in cls)","tryCatchPattern":"try:\n    dtype = pl.Enum(my_enum)\nexcept TypeError as e:\n    dtype = pl.Enum([str(v.value) for v in my_enum])","preventionTips":["Define Polars-facing enums as class X(str, enum.Enum)","Never feed IntEnum/IntFlag directly into pl.Enum","Convert values to strings explicitly before constructing"],"tags":["polars","enum","type-error","dtype"],"backgroundTag":"invalid-enum-argument","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"}