python - Python 重构方法中的 if-elif-else 语句
问题描述
我想尝试在我的代码中重构这个方法:
def get_params_in_string(params):
obj_name = params.PrefetchMethod.split('.')[0]
right_method_name = 'BuhReports.'
if obj_name in ('AccountAnalysisW', 'АнализСчетаW'):
obj = AccountAnalysis(None, params, None, None)
method_name = right_method_name + 'GetAccountAnalysis'
elif obj_name in ('TurnoverSheetW', 'ОборотнаяВедомостьW'):
obj = TurnoverSheet(None, params, None, None)
method_name = right_method_name + 'GetTurnoverSheet'
elif obj_name in ('CardAccountW', 'КарточкаСчетаW'):
obj = CardAccount(None, params, None, None)
method_name = right_method_name + 'GetCardAccount'
elif obj_name in ('MutualSettlementsW', 'ВзаиморасчетыW'):
obj = MutualSettlements(None, params, None, None)
method_name = right_method_name + 'GetMutualSettlements'
elif obj_name in ('JournalVoucherW', 'ЖурналОрдерW'):
obj = JournalVoucher(None, params, None, None)
method_name = right_method_name + 'GetJournalVoucher'
elif obj_name in ('WarehouseCompareW', 'СверкаСкладаW'):
obj = WarehouseCompare(None, params, None, None)
method_name = right_method_name + 'GetWarehouseCompare'
elif obj_name in ('DebtsW', 'ДолгиW'):
obj = Debts(None, params, None, None)
method_name = 'MutualSettlements.DebitorsAndCreditors'
else:
raise Exception('Unexpected call')
obj.prepare_filters()
params.Put('PrefetchMethod', method_name, sbis.FieldType.ftSTRING)
return JournalVoucher.GetParamsInString(params)
这是一个问题。我不喜欢很多重复的代码。在我看来,这里可以使用一些模式,但我不知道是哪一种。这种情况有什么解决办法吗?
解决方案
以下是如何使用字典重构代码的最小示例:
def foo_1(params):
return params[0]*2
def foo_2(params):
return params[0]*3
def run_ops(entry, params):
# Mapping between equivalent entries
entry_map = {'AccountAnalysisW':'АнализСчетаW', 'WarehouseCompareW':'СверкаСкладаW'}
# Dictionary with operations for each entry
entry_ops = {'АнализСчетаW': [foo_1, 'Foo1'], 'СверкаСкладаW': [foo_2, 'Foo2']}
if entry in entry_map:
entry = entry_map[entry]
if entry in entry_ops:
ops = entry_ops[entry]
res = ops[0](params)
print('Calling ' + ops[1] + ' with a result ' + str(res))
run_ops('WarehouseCompareW', [1,2,3])
run_ops('АнализСчетаW', [4,5])
这假定您可以有两个需要检查的等效条目。然后对于任何条目,字典将函数调用和一个字符串存储在一个列表中,主函数将调用该列表。
推荐阅读
- r - 如果然后命令产生字符串作为 r 中的输出
- xamarin - 您可以将 MaterialTextField 转换为条目吗?
- java - 在元素集列表中查找元素的属性
- git - Git revert 无法撤消文件删除
- php - 错误:CI_DB_mysql_result 类的对象无法转换为字符串 | 已经在搜索
- sqlite - 我可以在所有最新版本的 SQLite 中使用“AS”词并更新吗?
- laravel - laravel 查询进行分页
- python - 如何为 centernet 提取 DLA34 的特征?
- java - Eclipse 未运行 Java 方法:public void paint (Graphics g)
- jquery - 为什么我的字符串没有在 jQuery 中转换为数组