Yes, `value` in the setter of `EnumProperty` is always an `int`. 

You can use `set_blend_mode()` with `value` as `str`.

Like this:

```
import bpy
from bpy.types import Panel, PropertyGroup
from bpy.props import *


class CUSTOM_PG_property_group(PropertyGroup):

    def get_blend_mode(self):
        return self.get("blend_mode", "REGULAR")

    def set_blend_mode(self, value):
        if value == 'REGULAR':
            value = 0
        elif value == 'HARDLIGHT':
            value = 1
        elif value == 'ADD':
            value = 2
        elif value == 'SUBTRACT':
            value = 3
        elif value == 'MULTIPLY':
            value = 4
        elif value == 'DIVIDE':
            value = 5

        self["blend_mode"] = value

    blend_mode : EnumProperty(
        name = "Blend Mode",
        description = "TODO add description",
        items = (
            ("REGULAR", "Regular", ""),
            ("HARDLIGHT", "Hardlight", ""),
            ("ADD", "Add", ""),
            ("SUBTRACT", "Subtract", ""),
            ("MULTIPLY", "Multiply", ""),
            ("DIVIDE", "Divide", ""),
        ),
        get = get_blend_mode,
        set = set_blend_mode,
        default = "REGULAR",
    )


class HelloWorldPanel(Panel):
    bl_label = "Hello World Panel"
    bl_idname = "OBJECT_PT_hello"
    bl_space_type = 'VIEW_3D'
    bl_region_type = 'UI'
    bl_category = "Test"

    def draw(self, context):
        layout = self.layout

        custom = context.scene.custom
        
        layout.prop(custom, 'blend_mode')


classes = (
    CUSTOM_PG_property_group,
    HelloWorldPanel,
)


def register():
    for cls in classes:
        bpy.utils.register_class(cls)

    bpy.types.Scene.custom = PointerProperty(type=CUSTOM_PG_property_group)


def unregister():
    for cls in classes:
        bpy.utils.unregister_class(cls)
    
    del bpy.types.Scene.custom


if __name__ == "__main__":
    register()
```

e.g. `bpy.context.scene.custom.set_blend_mode('HARDLIGHT')`