Jak mogę użyć programowania funkcjonalnego, aby stworzyć ogólną metodę w Pythonie?

9

Chciałbym poprawić sposób pisania tego kodu. Obecnie mam sześć metod, które są prawie kopiowane-wklej, zmienia się tylko jedna linia. Jak mogę stworzyć ogólną metodę i w zależności od właściwości danych wejściowych zmienić obliczenia? Myślałem o użyciu programowania funkcjonalnego, aby to osiągnąć, ale nie jestem pewien, jak to zrobić poprawnie.

Metoda polega na uzyskaniu obiektu dict. Następnie ten obiekt jest przekształcany w JSON. midZmienna jest przechowywanie JSON z midrate dla waluty z zewnętrznego interfejsu API, musi być wcześniej pętli for inaczej API zostanie wywołana w każdej iteracji i spowalnia proces dużo! Następnie w forpętli iteruję dane z wejścia. Jedyną różnicą między metodami jest obliczenie przed umieszczeniem go na liście..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

Kolejna z metod:

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
źródło
(Linia zmiany jest list_p.append()linią dla tych, którzy nie są biegli w różnicowaniu kodu wizualnie. :))
AKX

Odpowiedzi:

14

Rzeczywiście istnieje sposób na zmniejszenie kodu tutaj za pomocą 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
źródło
2
Drobny nitpick, ale naprawdę zmieniłbym nazwę mi bna coś bardziej opisowego, biorąc pod uwagę, że jest to kod finansowy :)
AKX
2
Prawdopodobnie. To zależy od OP.
mario_sunny