Wie kann ich mithilfe der funktionalen Programmierung eine generische Methode in Python erstellen?

9

Ich möchte die Art und Weise verbessern, wie dieser Code geschrieben wird. Im Moment habe ich sechs Methoden, die fast kopiert und eingefügt werden, nur eine Zeile ändert sich. Wie kann ich eine generische Methode erstellen und abhängig von der Eigenschaft der Dateneingabe die Berechnungen ändern? Ich habe darüber nachgedacht, funktionale Programmierung zu verwenden, um dies zu erreichen, bin mir aber nicht sicher, wie ich es richtig machen soll.

Die Methode erhält ein Diktierobjekt. Dann wird dieses Objekt in JSON umgewandelt. Die midVariable speichert einen JSON mit mittlerer Rate für Währung von einer externen API. Sie muss vor der for-Schleife stehen, da sonst die API in jeder Iteration aufgerufen wird und dies den Prozess erheblich verlangsamt! Dann foriteriere ich in der Schleife durch die Daten von der Eingabe. Der einzige Unterschied zwischen den Methoden besteht in der Berechnung vor dem Einfügen in die 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

Eine andere der Methoden:

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
quelle
(Die sich ändernde Zeile ist die list_p.append()Zeile für diejenigen, die nicht sehr geschickt darin sind, Code visuell zu unterscheiden. :))
AKX

Antworten:

14

In der Tat gibt es hier eine Möglichkeit, den Code mit Lambdas zu reduzieren :

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
quelle
2
Kleinere Nitpick, aber ich würde wirklich umbenennen mund bzu etwas Beschreibenderem, wenn man bedenkt, dass dies Finanzcode ist :)
AKX
2
Wahrscheinlich. Es liegt am OP.
mario_sunny