¿Cómo puedo usar la programación funcional para hacer un método genérico en python?

9

Me gustaría mejorar la forma en que se escribe este código. En este momento tengo seis métodos que son casi copiar y pegar, solo una línea está cambiando. ¿Cómo puedo hacer un método genérico y dependiendo de la propiedad de la entrada de datos para cambiar los cálculos? Estaba pensando en usar la programación funcional para lograr eso, pero no estoy seguro de cómo hacerlo correctamente.

El método es obtener un objeto dict. Entonces este objeto se transforma en JSON. La midvariable está almacenando un JSON con una tasa media para la moneda desde una API externa, debe estar antes del ciclo for, de lo contrario, se llamará a la API en cada iteración y esto ralentiza mucho el proceso. Luego, en el forbucle, itero a través de los datos de la entrada. La única diferencia entre los métodos es el cálculo antes de insertarlo en la 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

Otro de los 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
fuente
(La línea cambiante es la list_p.append()línea, para aquellos que no son muy expertos en diferenciar el código visualmente. :))
AKX

Respuestas:

14

De hecho, hay una manera de reducir el código aquí 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
mario_sunny
fuente
2
Nitpick menor, pero que realmente me cambio el nombre my botro más descriptivo considerando que es código financiero :)
AKX
2
Probablemente. Está en el OP.
mario_sunny