Como posso usar a programação funcional para criar um método genérico em python?

9

Eu gostaria de melhorar a maneira como este código é escrito. No momento, tenho seis métodos que são quase copiar e colar, apenas uma linha está mudando. Como posso criar um método genérico e, dependendo da propriedade da entrada de dados, alterar os cálculos? Eu estava pensando em usar a programação funcional para conseguir isso, mas não sei como fazê-lo corretamente.

O método está recebendo um objeto dict. Então este objeto é transformado em JSON. A midvariável está armazenando um JSON com midrate para moeda da API externa, ela deve ser anterior ao loop for, caso contrário, a API será chamada em todas as iterações e isso atrasa muito o processo! Então, no forloop, eu percorro os dados da entrada. A única diferença entre os métodos é o cálculo antes de inseri-lo na lista..append(mid_current - bankMSell)

def margin_to_exchange_rate_sell(data):
    j = data.to_JSON()
    list_p = []
    mid = midrate.get_midrate(j["fromCurrency"][0])
    for idx, val in enumerate(j['toCurrency']):
        try:
            mid_current = 1/get_key(mid, j['toCurrency'][idx])
            bankMSell = float(j['sellMargin'][idx])
            list_p.append(mid_current - bankMSell)
        except Exception as e:
            list_p.append(0)
            print(str(e))

    return list_p

Outro dos métodos:

def margin_to_exchange_rate_buy(data):
    j = data.to_JSON()
    list_p = []
    mid = midrate.get_midrate(j["fromCurrency"][0])
    for idx, val in enumerate(j['toCurrency']):
        try:
            mid_current = 1/get_key(mid, j['toCurrency'][idx])
            bankMSell = float(j['sellMargin'][idx])
            list_p.append(mid_current + bankMSell)
        except Exception as e:
            list_p.append(0)
            print(str(e))

    return list_p
Demi Dimitrova
fonte
(A linha de mudança é a list_p.append()linha, para aqueles que não estão muito perito na diffing código visualmente :).)
AKX

Respostas:

14

De fato, há uma maneira de reduzir o código aqui com lambdas :

def margin_to_exchange_rate_sell(data):
    return margin_to_exchange_rate(data, lambda m, b: m - b)


def margin_to_exchange_rate_buy(data):
    return margin_to_exchange_rate(data, lambda m, b: m + b)


def margin_to_exchange_rate(data, operation):
    j = data.to_JSON()
    list_p = []
    mid = midrate.get_midrate(j["fromCurrency"][0])
    for idx, val in enumerate(j['toCurrency']):
        try:
            mid_current = 1/get_key(mid, j['toCurrency'][idx])
            bankMSell = float(j['sellMargin'][idx])
            list_p.append(operation(mid_current, bankMSell))
        except Exception as e:
            list_p.append(0)
            print(str(e))

    return list_p
mario_sunny
fonte
2
Nitpick menor, mas eu realmente renomear me bpara algo mais descritivo considerando este é o código financeira :)
AKX
2
Provavelmente. É o OP.
Mario_sunny #