139 lines
4.7 KiB
Python
139 lines
4.7 KiB
Python
#!/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) # 输出: 未找到中文字段 '不存在的函数' 对应的函数
|