首页 > 解决方案 > 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)

这是一个问题。我不喜欢很多重复的代码。在我看来,这里可以使用一些模式,但我不知道是哪一种。这种情况有什么解决办法吗?

标签: pythonrefactoring

解决方案


以下是如何使用字典重构代码的最小示例:

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])

这假定您可以有两个需要检查的等效条目。然后对于任何条目,字典将函数调用和一个字符串存储在一个列表中,主函数将调用该列表。


推荐阅读