Come posso usare la programmazione funzionale per creare un metodo generico in Python?


9

Vorrei migliorare il modo in cui questo codice è scritto. In questo momento ho sei metodi che sono quasi copia-incolla, sta cambiando solo una riga. Come posso effettuare un metodo generico e in base alla proprietà dell'input di dati per modificare i calcoli? Stavo pensando di usare la programmazione funzionale per raggiungere questo obiettivo, ma non sono sicuro di come farlo correttamente.

Il metodo sta ottenendo un oggetto dict. Quindi questo oggetto viene trasformato in JSON. La midvariabile memorizza un JSON con frequenza media per la valuta dall'API esterna, deve essere prima del ciclo for, altrimenti l'API verrà chiamata in ogni iterazione e questo rallenta molto il processo! Quindi, nel forciclo, eseguo l'iterazione attraverso i dati dall'input. L'unica differenza tra i metodi è il calcolo prima di inserirlo nell'elenco..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

Un altro dei metodi:

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

(La linea che cambia è la list_p.append()linea, per coloro che non sono molto abili nel diffondere codice visivamente. :))
AKX

Risposte:


14

In effetti, c'è un modo per ridurre il codice qui con 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

2
Piccolo pignolo, ma rinominerei davvero me bcon qualcosa di più descrittivo considerando che si tratta di un codice finanziario :)
AKX,

2
Probabilmente. È il PO.
mario_sunny,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.