data_factory/utils/enum_utils.py

139 lines
4.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2025/3/15 16:12
# @Author : AngesZhu
# @File : enum_utils.py
# @Desc : 枚举相关封装类,实现数据生成规则函数与中文字段的对应关系
import importlib
from enum import Enum
# 自定义异常类
class FunctionNotFoundError(Exception):
"""当未找到对应的中文字段时抛出此异常"""
pass
# 动态注册的辅助类
class DynamicFunctionRegistry:
"""
动态注册中文字段与函数的辅助类。
"""
_registry = {}
@classmethod
def register(cls, zh_name, func):
"""
动态注册一个新的中文字段与函数对应关系。
:param zh_name: 中文字段
:param func: 函数对象
"""
if zh_name in cls._registry:
raise ValueError(f"中文字段 '{zh_name}' 已经存在")
cls._registry[zh_name] = func
@classmethod
def get_func(cls, zh_name):
"""
根据中文字段获取动态注册的函数。
:param zh_name: 中文字段
:return: 对应的函数对象,如果未找到则返回 None
"""
return cls._registry.get(zh_name)
# 定义枚举类
class FunctionEnum(Enum):
def __init__(self, zh_name, func):
self.zh_name = zh_name # 中文字段
self.func = func # 对应的函数
@classmethod
def get_func_by_zh_name(cls, zh_name):
"""
根据中文字段获取对应的函数。
:param zh_name: 中文字段
:return: 对应的函数对象
:raises FunctionNotFoundError: 如果未找到对应的中文字段
"""
for item in cls:
if item.zh_name == zh_name:
return item.func
# 检查动态注册的函数
dynamic_func = DynamicFunctionRegistry.get_func(zh_name)
if dynamic_func:
return dynamic_func
# raise FunctionNotFoundError(f"未找到中文字段 '{zh_name}' 对应的函数")
return None
@classmethod
def register_dynamic_function(cls, zh_name, func_path):
"""
动态注册一个新的中文字段与函数对应关系。
:param zh_name: 中文字段
:param func_path: 函数路径(模块名.函数名)
"""
module_name, func_name = func_path.rsplit(".", 1)
module = importlib.import_module(module_name)
func = getattr(module, func_name)
DynamicFunctionRegistry.register(zh_name, func)
@classmethod
def call_function(cls, zh_name, *args, **kwargs):
"""
调用已注册的函数,并传递参数。
:param zh_name: 中文字段
:param args: 位置参数
:param kwargs: 关键字参数
:return: 函数执行结果
:raises FunctionNotFoundError: 如果未找到对应的中文字段
"""
func = cls.get_func_by_zh_name(zh_name)
return func(*args, **kwargs)
# 测试代码
if __name__ == "__main__":
try:
# 查询已有的中文字段对应的函数并调用
func = FunctionEnum.get_func_by_zh_name("函数二")
print(func()) # 输出: 这是函数2
# 动态注册新的中文字段与函数
FunctionEnum.register_dynamic_function(
"动态函数",
"new_function.new_function" # 动态注册的函数路径
)
# 查询动态注册的函数并调用
func = FunctionEnum.get_func_by_zh_name("动态函数")
print(func()) # 输出: 这是动态注册的函数
# 查询已有的中文字段对应的函数并调用(带参数)
func = FunctionEnum.get_func_by_zh_name("函数二")
print(func("参数1", "参数2")) # 输出: 这是函数2参数参数1, 参数2
# 查询已有的中文字段对应的函数并调用(可变参数)
func = FunctionEnum.get_func_by_zh_name("函数三")
print(func(1, 2, key="value")) # 输出: 这是函数3参数(1, 2), {'key': 'value'}
# 调用无参数的函数
result = FunctionEnum.call_function("函数一")
print(result) # 输出: 这是函数1
# 调用带参数的函数
result = FunctionEnum.call_function("函数二", "参数1", "参数2")
print(result) # 输出: 这是函数2参数参数1, 参数2
# 调用带可变参数的函数
result = FunctionEnum.call_function("函数三", 1, 2, key="value")
print(result) # 输出: 这是函数3参数(1, 2), {'key': 'value'}
# 查询不存在的中文字段
func = FunctionEnum.get_func_by_zh_name("不存在的函数")
except FunctionNotFoundError as e:
print(e) # 输出: 未找到中文字段 '不存在的函数' 对应的函数