dim_handle_registry.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. # -*- coding: utf-8 -*-
  2. # @Time : 2023/7/24 11:03
  3. # @Author : XuJiakai
  4. # @File : dim_handle_registry
  5. # @Software: PyCharm
  6. from data_clean.exception.exception_handle import exception_handle
  7. class DimHandleRegistry:
  8. def __init__(self, name=None):
  9. if name is None:
  10. self._name = "DefaultRegistry"
  11. if name.endswith(".py"):
  12. name = name[:-3]
  13. self._name = name
  14. # 创建注册表,以字典的形式。
  15. self._obj_list = {}
  16. self._row_func = []
  17. def __registry(self, obj, name=None):
  18. """
  19. 内部注册函数
  20. :param obj:函数或者类的地址。
  21. :return:
  22. """
  23. # 判断是否目标函数或者类已经注册,如果已经注册过则标错,如果没有则进行注册。
  24. if name is None:
  25. name = obj.__name__
  26. assert (obj.__name__ not in self._obj_list.keys()), "{} already exists in {}".format(obj.__name__, self._name)
  27. self._obj_list[name] = obj
  28. def registry(self, obj=None):
  29. """
  30. # 外部注册函数。注册方法分为两种。
  31. # 1.通过装饰器调用
  32. # 2.通过函数的方式进行调用
  33. :param obj: 函数或者类的本身
  34. :return:
  35. """
  36. # 1.通过装饰器调用
  37. if obj == None:
  38. def _no_obj_registry(func__or__class, *args, **kwargs):
  39. self.__registry(func__or__class)
  40. # 此时被装饰的函数会被修改为该函数的返回值。
  41. return func__or__class
  42. return _no_obj_registry
  43. # 2.通过函数的方式进行调用
  44. self.__registry(obj)
  45. def registry_prefix_func(self, obj=None):
  46. if obj == None:
  47. def _no_obj_registry(func__or__class, *args, **kwargs):
  48. self.__registry(func__or__class, name="prefix_func")
  49. # 此时被装饰的函数会被修改为该函数的返回值。
  50. return func__or__class
  51. return _no_obj_registry
  52. # 2.通过函数的方式进行调用
  53. self.__registry(obj, name="prefix_func")
  54. pass
  55. def registry_postfix_func(self, obj=None):
  56. if obj == None:
  57. def _no_obj_registry(func__or__class, *args, **kwargs):
  58. self.__registry(func__or__class, name="postfix_func")
  59. # 此时被装饰的函数会被修改为该函数的返回值。
  60. return func__or__class
  61. return _no_obj_registry
  62. # 2.通过函数的方式进行调用
  63. self.__registry(obj, name="postfix_func")
  64. pass
  65. def registry_row_func(self, obj=None):
  66. if obj == None:
  67. def _no_obj_registry(func__or__class, *args, **kwargs):
  68. self._row_func.append(func__or__class)
  69. # 此时被装饰的函数会被修改为该函数的返回值。
  70. return func__or__class
  71. return _no_obj_registry
  72. # 2.通过函数的方式进行调用
  73. self._row_func.append(obj)
  74. pass
  75. @exception_handle
  76. async def execute_dim(self, dim_data: list):
  77. if "prefix_func" in self._obj_list:
  78. await self._obj_list["prefix_func"](dim_data)
  79. result_list = []
  80. for row in dim_data:
  81. row_data = await self._exec_row(row)
  82. if row_data is not None:
  83. result_list.append(row_data)
  84. if "postfix_func" in self._obj_list and len(result_list) > 0:
  85. await self._obj_list["postfix_func"](result_list)
  86. return result_list
  87. @exception_handle
  88. async def _exec_row(self, row_data: dict):
  89. for func in self._row_func:
  90. row_data = await func(row_data)
  91. if row_data is None:
  92. return row_data
  93. pass
  94. return row_data