Comment puis-je utiliser la programmation fonctionnelle pour créer une méthode générique en python?

9

Je voudrais améliorer la façon dont ce code est écrit. En ce moment, j'ai six méthodes qui sont presque du copier-coller, une seule ligne change. Comment puis-je faire une méthode générique et en fonction de la propriété de l'entrée de données pour modifier les calculs? Je pensais utiliser une programmation fonctionnelle pour y parvenir, mais je ne sais pas comment le faire correctement.

La méthode consiste à obtenir un objet dict. Ensuite, cet objet est transformé en JSON. La midvariable stocke un JSON avec taux moyen pour la devise à partir de l'API externe, elle doit être avant la boucle for, sinon l'API sera appelée à chaque itération et cela ralentit beaucoup le processus! Ensuite, dans la forboucle, j'itère les données de l'entrée. La seule différence entre les méthodes est le calcul avant de l'insérer dans la liste..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

Une autre des méthodes:

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
la source
(La ligne changeante est la list_p.append()ligne, pour ceux qui ne sont pas très habiles à différencier visuellement le code. :))
AKX

Réponses:

14

En effet, il existe un moyen de réduire le code ici avec 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
la source
2
Petite piqûre, mais je renommerais vraiment met bà quelque chose de plus descriptif étant donné que c'est le code financier :)
AKX
2
Probablement. C'est l'OP.
mario_sunny