Как я могу использовать функциональное программирование для создания универсального метода в Python?

9

Я хотел бы улучшить способ написания этого кода. Прямо сейчас у меня есть шесть методов, которые почти копирование-вставка, меняется только одна строка. Как сделать общий метод и в зависимости от свойства ввода данных изменить расчеты? Я думал использовать функциональное программирование для достижения этой цели, но я не уверен, как это сделать правильно.

Метод получает объект dict. Затем этот объект преобразуется в JSON. midПеременная хранения JSON с midrate для валюты от внешнего API, он должен быть перед циклом иначе API будет вызываться в каждой итерации и это замедляет процесс много! Затем в forцикле я перебираю данные из входных данных. Единственная разница между методами заключается в расчете до его вставки в список..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

Еще один из методов:

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
Деми Димитрова
источник
(Изменяющаяся строка - это list_p.append()строка для тех, кто не очень хорошо разбирается в коде визуально. :))
AKX

Ответы:

14

Действительно, есть способ уменьшить код здесь с помощью лямбды :

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
источник
2
Незначительное придираться, но я действительно переименовывать mи bк чему - то более описательный учитывая , что это финансовый код :)
AKX
2
Вероятно. Это до ОП.
mario_sunny