Bagaimana saya bisa menggunakan pemrograman fungsional untuk membuat metode generik dengan python?

9

Saya ingin memperbaiki cara kode ini ditulis. Saat ini saya memiliki enam metode yang hampir sama, hanya satu baris yang berubah. Bagaimana saya bisa membuat metode generik dan tergantung pada properti input data untuk mengubah perhitungan? Saya berpikir untuk menggunakan pemrograman fungsional untuk mencapai itu, tetapi saya tidak yakin bagaimana melakukannya dengan benar.

Metode ini mendapatkan objek dict. Kemudian objek ini ditransformasikan menjadi JSON. The midvariabel menyimpan JSON dengan midrate untuk mata uang dari API eksternal, itu harus sebelum untuk loop sebaliknya API akan dipanggil di setiap iterasi dan memperlambat ini turun proses banyak! Kemudian dalam forloop, saya beralih melalui data dari input. Satu-satunya perbedaan antara metode adalah perhitungan sebelum memasukkannya dalam daftar..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

Salah satu metode lain:

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
sumber
(Baris penggantinya adalah list_p.append()baris, bagi mereka yang tidak mahir dalam membedakan kode secara visual. :))
AKX

Jawaban:

14

Memang, ada cara untuk mengurangi kode di sini dengan 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
sumber
2
Minor nitpick, tapi saya benar-benar mengganti nama mdan bmenjadi sesuatu yang lebih deskriptif mengingat ini adalah kode keuangan :)
AKX
2
Mungkin. Terserah OP.
mario_sunny