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