【问题标题】:Dictionary map in a handler function for class methods类方法的处理函数中的字典映射
【发布时间】:2020-10-28 09:47:52
【问题描述】:

我有一个类接受不同数量的输入但实现相同的目标(相同的输出)。它是一个复杂的类,大量用于 API。我构建了一个类处理程序,它接受输入并根据 API 请求将它们映射到函数中。

我不确定这种设计是否可维护,或者它是否会带来其他问题。所以我有这些询问:

  1. 这种设计是否可维护和可扩展?
  2. 这是容错的吗?
  3. 我可以改进它吗?
  4. 我是否遵循与任何公认的设计模式相似的设计?
  5. 有什么建议吗?

请看一下这个非常简化的代码设计:

处理程序:

def class_handler(class_usage_type, class_object, kwargs):
    # Method inputs and procedures are different but output is the same
    Usage_FUNC_MAP = { 
        'use_method_x': class_object.method_x, 
        'use_method_y': class_object.method_y,
        'use_method_z': class_object.method_z,
        # ...
    }
    
    try:
        result = Usage_FUNC_MAP[class_usage_type](**kwargs)
        
    except Exception as e:
        result = {
            'output_elem1': kwargs
            'output_elem2': f'Error: {e}',
            'output_elem3': f'Error {e}'
        }

    finally:
        return result

class some_class():
    # ...init
    def method_x(self, param1_for_x, param2_for_x):
        # ...procedure for x
        return same_output

    def method_y(self, param1_for_y):
        # ...procedure for y
        return same_output

    def method_z(self, param1_for_z, param2_for_z, param3_for_z, param4_for_z):
        # ...procedure for z
        return same_output

    # ...

API

# Main is in a different file as an API
# Route 1 for x
# ...
params_for_x = {"param1_for_x": '...', "param2_for_x": '...'}
result_for_x = class_handler(class_usage_type='use_method_x', class_object=some_class, kwargs=params)
#...

# Route 2 for y
# ...
params_for_y = {"param1_for_y": '...'}
result_for_y = class_handler(class_usage_type='use_method_y', class_object=some_class, kwargs=params)
# ...

# Route 3 for z
# ...
params_for_z = {"param1_for_z": '...', "param2_for_z": '...', "param3_for_z": '...', "param4_for_z": '...'}
result_for_z = class_handler(class_usage_type='use_method_z', class_object=some_class, kwargs=params)
# ...

# ...

【问题讨论】:

  • 为什么需要类处理程序?你也可以访问result_for_x = some_class.method_x(params) ?
  • 看起来这是更适合Code Review的问题
  • @AlexanderRiedel 在一个地方处理输入参数的差异,这可能会产生错误,而不是在类中的每个函数中处理它们。另一个原因是在 API 使用方面使用函数“名称”

标签: python class design-patterns structure handler


【解决方案1】:

要摆脱该函数映射,您可以使用getattr() 函数并将函数名称作为字符串传递。 示例:

def class_handler(class_usage_type, class_object, kwargs):

    try:
        result = getattr(class_object(), class_usage_type)(**kwargs)
        
    except Exception as e:
        result = {
            'output_elem1': kwargs,
            'output_elem2': f'Error: {e}',
            'output_elem3': f'Error {e}'
        }

    finally:
        return result

class some_class():
    # ...init
    def method_x(self, param1_for_x, param2_for_x):
        # ...procedure for x
        return same_output


params_for_x = {"param1_for_x": '...', "param2_for_x": '...'}
result_for_x = class_handler(class_usage_type='method_x', class_object=some_class, kwargs=params_for_x)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-20
    • 2023-01-30
    • 2021-09-30
    • 2020-04-30
    • 1970-01-01
    • 2019-08-08
    • 2021-08-02
    • 2021-10-30
    相关资源
    最近更新 更多