Як я можу використовувати функціональне програмування для створення загального методу в 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

2
Невеликий нітпік, але я б дійсно перейменував mі bщось більш описове враховуючи це фінансовий код :)
AKX

2
Мабуть. Це до OP.
mario_sunny
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.