Python'da genel bir yöntem yapmak için fonksiyonel programlamayı nasıl kullanabilirim?


9

Bu kodun yazılma şeklini geliştirmek istiyorum. Şu anda neredeyse kopyala yapıştır olan altı yöntemim var, sadece bir satır değişiyor. Nasıl genel bir yöntem yapabilirim ve hesaplamaları değiştirmek için veri girişinin özelliğine bağlı olarak? Bunu başarmak için fonksiyonel programlamayı kullanmayı düşünüyordum, ancak bunu nasıl doğru bir şekilde yapacağımdan emin değilim.

Yöntem bir dikte nesnesi almaktır. Sonra bu nesne JSON'a dönüştürülür. midDeğişken harici API para birimi için midrate ile JSON depoluyor, bu olmalı önce aksi API her tekrarında adı verilecek döngü ve sürecin bir çok şey bu yavaşlatır için! Sonra fordöngüde, giriş verileri üzerinden yineleme. Yöntemler arasındaki tek fark, listeye eklemeden önceki hesaplamadır..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

Yöntemlerden bir diğeri:

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

(Değişen çizgi, list_p.append()kodu görsel olarak ayırt etmede çok usta olmayanlar için çizgi. :))
AKX

Yanıtlar:


14

Gerçekten de, burada lambdalarla kodu azaltmanın bir yolu var :

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
Küçük nitpick, ama ben gerçekten yeniden adlandırmak mve bbu finansal kod olduğunu düşünüyor daha açıklayıcı bir şey :)
AKX

2
Muhtemelen. OP bitti.
mario_sunny
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.