Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 类方法的处理程序函数中的字典映射_Python_Class_Design Patterns_Structure_Handler - Fatal编程技术网

Python 类方法的处理程序函数中的字典映射

Python 类方法的处理程序函数中的字典映射,python,class,design-patterns,structure,handler,Python,Class,Design Patterns,Structure,Handler,我有一个类,它接受不同数量的输入,但实现相同的目标(相同的输出)。它是一个复杂的类,大量用于API。我构建了一个类处理程序,它接受输入并根据API请求将它们映射到函数中 我不确定这种类型的设计是可维护的,还是会出现其他问题。所以我有这些问题: 这种设计是可维护和可扩展的吗 这是容错的吗 我能改进一下吗 我是否遵循与任何公认的设计模式类似的设计 有什么建议吗 请看一下这个非常简化的代码设计: 处理程序: def class_handler(class_usage_type, class_objec

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

我不确定这种类型的设计是可维护的,还是会出现其他问题。所以我有这些问题:

  • 这种设计是可维护和可扩展的吗
  • 这是容错的吗
  • 我能改进一下吗
  • 我是否遵循与任何公认的设计模式类似的设计
  • 有什么建议吗
  • 请看一下这个非常简化的代码设计:

    处理程序:

    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
    
    阶级

    原料药


    要去掉该函数映射,可以使用
    getattr()
    函数并将函数名作为字符串传递。 例如:


    为什么需要类处理程序?您还可以访问某个类的
    result\u。方法\u x(params)
    ?这似乎是一个更适合@AlexanderRiedel在一个地方处理输入参数差异的问题,它可能会产生错误,而不是在类中的每个函数中处理它们。另一个原因是在API使用方面使用函数“名称”
    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
    
        # ...
    
    # 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)
    # ...
    
    # ...
    
    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)